【问题标题】:.SqlDataReader.ReadColumnHeader NullReferenceException.SqlDataReader.ReadColumnHeader NullReferenceException
【发布时间】:2013-08-29 17:53:53
【问题描述】:

这个问题与my previous one 的答案有些相关,这帮助我找到了通过 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

不返回所有记录。结果当 Generic.List 更改其容量以容纳更多元素(例如从 2^19 到下一个 2^20)时,此时 SqlDataReader 简单退出,其 Read 方法返回 False,好像没有更多记录一样。

大多数时候它会安静地退出,不会抛出任何异常。但时不时我会得到:

NullReferenceException {"对象引用未设置为 对象。”}

在 System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
在 System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 我,布尔 setTimeout) 在 System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)

我知道 Reader 使用的存储过程返回的所有记录(它是单列)都是整数值。如果我删除行 m_aFullIDList.Add 而是将值简单地读取到整数变量中,或者如果我将通用列表容量预先分配给一个已知的大数 - 这个问题就不会发生。显然它只发生在 List 重新分配容量时 - 这会影响读者。

我还尝试使用其他结构(ArrayList,甚至 Array,使用 Array.Resize),只要此结构的容量重新分配超过某个点 - 这会破坏 SqlDataReader。

这个 ASP.NET 项目有点复杂,所以当我尝试在一个独立的简单项目中重新创建问题时,该项目仅包含执行阅读器和读入列表 - 问题没有发生。知道发生了什么以及如何解决这个问题吗?

【问题讨论】:

  • 我很确定您遇到以下两种症状之一:应用程序域内存不足阅读器超时。
  • @neoistheone 感谢您的及时回复。我考虑过这一点,但是连接和命令超时都设置为大于 SP 执行所需的值(我是否错过了任何其他超时?)而且我似乎也有足够的内存(容量的预分配似乎工作)

标签: ado.net nullreferenceexception sqldatareader generic-list


【解决方案1】:

我想我终于想通了。

我的代码中的逻辑有 2 个步骤 - 调用返回 SqlDataReader 的函数,然后在另一个函数中使用该读取器来填充列表:

Dim oReader as SqlDataReader = GetTheReader()

FillTheList(oReader)

函数 GetTheReader() 看起来像这样:

Function GetTheReader() as SqlDataReader
   Dim oConn As New SqlConnection("Connection String") : oConn.Open()
   Dim oComm As New SqlCommand("Stored Procedure", oConn)

   Dim oReader As SqlDataReader = oComm.ExecuteReader(CommandBehavior.CloseConnection)

   Return oReader
End Function

它以 local 变量的形式打开连接,当函数返回给调用者时,该变量超出范围。并且当填充通用列表时,在另一个容量分配垃圾收集通过破坏过时的变量(并关闭该连接)来声明该内存。我留下了一个没有有效连接的 SqlDataReader。

我目前的解决方案是在GetTheReader 函数之外创建连接并将其作为参数之一传递。

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多