【发布时间】: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