【问题标题】:SqlDataReader does not read all recordsSqlDataReader 不会读取所有记录
【发布时间】: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


【解决方案1】:

使用ExecuteReader overload 可能会有所帮助,它允许您指定CommandBehavior,并按照此MSDN 主题中的建议传递CommandBehavior.SequentialAccess

Retrieving Large Data (ADO.NET).

【讨论】:

  • 已经在使用 ExecuteReader(CommandBehavior.CloseConnection + CommandBehavior.SequentialAccess) 似乎没有帮助。关于分成大块 - 我该怎么做?我不控制SP
  • 我刚刚看到你就是那个人:stackoverflow.com/a/12464309/284240 所以它不能正常工作
  • 抱歉重复,决定重新审视一下。这是一件奇怪的事情——它似乎工作了一段时间,然后就没有更多的效果了。不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2021-07-10
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多