首页 > 解决方案 > 从服务器执行查询时的记录数不同

问题描述

我有一个在 SQL Server 数据库上执行的查询。我使用 VPN 连接到数据库服务器。我正在使用 ADO .NET DataReader 读取查询结果。当我在本地机器上执行代码时,我得到了所有预期的结果,当我的代码在连接了 VPN 的亚马逊服务器中运行时,我只得到一些结果。

我正在使用 .Net Core 2.2 和 Sql Server Microsoft SQL Server 2017

using (SqlConnection sqlConnection = new SqlConnection("connectionString"))
{
     await sqlConnection.OpenAsync();
     SqlCommand command = sqlConnection.CreateCommand();
     command.CommandText = "SELECT * FROM TestTable";             
     Int32 count = 0;
     var dr = await command.ExecuteReaderAsync();
     while (await dr.ReadAsync())
     {
          count++;
     }          

}

count 应该是 TestTable 的总行数(60k),但它更低。

我还做了以下测试:

using (SqlConnection sqlConnection = new SqlConnection("connectionString"))
{
     await sqlConnection.OpenAsync();
     SqlCommand commandCount = sqlConnection.CreateCommand();
     commandCount.CommandText = "SELECT COUNT(*) FROM TestTable";
     Int32 expectedCount = (Int32)commandCount.ExecuteScalar();

     SqlCommand command = sqlConnection.CreateCommand();
     command.CommandText = "SELECT * FROM TestTable";             
     Int32 count = 0;
     var dr = await command.ExecuteReaderAsync();
     while (await dr.ReadAsync())
     {
          count++;
     }          
     var areEqual = expectedCount == count;

}

变量 areEqual 应该是 true,但它是 false,因为 count 总是低于 expectedCount。expectedCount 是 60k,count 是 1k。此问题仅在生产服务器中执行查询时发生。我在控制台应用程序中运行代码。

我认为与数据库的连接存在问题,因为如果在读取所有结果后处置 Datareader,我会得到以下异常:

System.InvalidOperationException:内部连接致命错误。
在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady)
在 System.Data.SqlClient.SqlDataReader.TryCloseInternal(布尔 closeReader)
在 System.Data.SqlClient。 SqlDataReader.Close()
在 System.Data.SqlClient.SqlDataReader.Dispose(Boolean disposing)
在 System.Data.Common.DbDataReader.Dispose()

编辑:我尝试删除异步方法,但仍然得到相同的结果:

using (SqlConnection sqlConnection = new SqlConnection("connectionString"))
{
     sqlConnection.Open();
     SqlCommand command = sqlConnection.CreateCommand();
     command.CommandText = "SELECT * FROM TestTable";             
     Int32 count = 0;
     var dr = command.ExecuteReader();
     while (dr.Read())
     {
          count++;
     }          

}

编辑 1:我尝试了相同的代码,但使用了完整的 .NET Framework 4.7.1 并得到了相同的错误结果

编辑 2:在生产服务器中安装了 SSMS,执行查询时出现以下错误:执行批处理时发生错误。错误消息是:内部连接致命错误。错误状态:15,令牌:48

标签: c#sql-server.net-coredatareader

解决方案


推荐阅读