【发布时间】:2012-11-03 22:06:43
【问题描述】:
我在最简单的一段 VB.NET 代码中遇到了一个非常奇怪的问题:
Public Sub ReadIDs(i_oDataReader As Data.SqlClient.SqlDataReader)
m_aFullIDList = New Generic.List(Of Integer)
While i_oDataReader.Read
If i_oDataReader.IsDBNull(0) = False Then
m_aFullIDList.Add(i_oDataReader.GetInt32(0))
End If
End While
m_iTotalNumberOfRecords = m_aFullIDList.Count
End Sub
基本上,该过程接受一个 DataReader 作为参数,遍历阅读器中的所有记录,将它们添加到一个通用整数列表中。
当阅读器后面的 SQL 存储过程返回相对少量的记录(低于 100K)时,阅读器读取所有记录并且最终计数与结果集匹配。但是当记录数超过 100 万时 - 结果变得不可预测。
例如当我知道 SP 重新返回 150 万条记录时 - 通用列表中的最终记录数可能是 200K、500K 等。
知道是什么原因造成的以及如何解决吗?谢谢!
【问题讨论】:
-
什么样的应用程序,ASP.NET 还是其他多线程类型?
-
感谢您的及时回复。事实上,ASP.NET。
-
它是否可以在调试时重现或仅在生产中重现?有什么像连接一样的静态(共享)吗?你有例外吗?
-
首先要做的是单独运行代码 - 或许可以将粘贴剪切到测试程序中。检查是否成功。如果是这样,那么错误很可能是与程序的另一部分交互。如果相同,那么您需要更深入并隔离导致错误的点(行数)。然后尝试找出基础设施的哪一部分被破坏 - 通过用数据集替换部分,例如阅读器,数据库引擎?等等等等。也把try catchs放进去看看是否引发了异常来帮助你。
-
在独立代码中的行为方式相同。我注意到如果我使用简单的
i_oDataReader(0)而不是i_oDataReader.GetInt32(0),我会更频繁地得到正确的计数,但由于某种原因,读者时不时会抛出 NullReferenceException。
标签: sql vb.net stored-procedures sqldatareader datareader