我之前曾两次尝试为这个问题找到解决方案,但不幸的是,这些答案并没有提供永久修复,所以我在这里,再试一次。
我有一个 SQL Server 存储过程,它返回 150 万个整数 ID 的列表。我从 ASP.NET/VB.NET 代码调用此 SP 并执行 SqlDataReader:
m_dbSel.CommandType = CommandType.StoredProcedure
m_dbSel.CommandText = CstSearch.SQL.SP_RS_SEARCH_EX
oResult = m_dbSel.ExecuteReader(CommandBehavior.CloseConnection)
然后我将该阅读器传递给类构造函数以构建通用列表(整数)。代码非常基本:
Public Sub New(i_oDataReader As Data.SqlClient.SqlDataReader)
m_aFullIDList = New Generic.List(Of Integer)
While i_oDataReader.Read
m_aFullIDList.Add(i_oDataReader.GetInt32(0))
End While
m_iTotalNumberOfRecords = m_aFullIDList.Count
End Sub
问题是 - 这并没有读取所有 150 万条记录,数量不一致,最终计数可能是 500K 或 100 万条等。(通常返回524289条记录的“神奇”数量)。我尝试CommandBehavior.SequentialAccess
在执行命令时使用设置,但结果也不一致。
当我在 SSMS 中运行 SP 时,它几乎会立即返回一定数量的记录并显示它们,但随后会继续运行几秒钟,直到所有 150 万条记录都完成 - 这与此有关吗?
更新
过了一会儿,我发现在非常罕见的情况下,上面的循环代码确实会引发异常:
System.NullReferenceException:对象引用未设置为对象的实例。在 System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
所以确实会发生一些内部故障。看起来如果我更换
While i_oDataReader.Read
m_aFullIDList.Add(i_oDataReader.GetInt32(0))
End While
处理整数
While i_oDataReader.Read
m_aFullIDList.Add(i_oDataReader(0))
End While
处理对象 - 代码似乎运行没有故障并返回所有记录。
去搞清楚。