为什么在打开连接的情况下“无法尝试在读取器关闭时调用HasRows”?

时间:2012-12-20 08:55:05

标签: c# .net sql-server-2008

我有这段代码:

// this is managed elsewhere
SqlConnection connection =...
connection.Open();

// this is one block of code, separate from the above
using( var transaction = connection.BeginTransaction() ) {
   using( var command = connection.CreateCommand() ) {
     command.Transaction = transaction;
     command.CommandText = ...
     using( var reader = command.ExecuteReader() ) {
         if( reader.HasRows ) {
             if( reader.Read() ) {
                 //get data from the reader
             }
         }
     }
}

这个代码大部分时间运行得很好。但有时 - 很少 - 检索HasRows会产生以下异常:

Invalid attempt to call HasRows when reader is closed.
System.InvalidOperationException
  at System.Data.SqlClient.SqlDataReader.get_HasRows()
  // my code calling HasRows listed here

我99.5%肯定在那一刻连接是开放的。在阅读阅读器pretty much like MSDN suggests之前,我的代码使用了HasRows

该例外的原因可能是什么?

4 个答案:

答案 0 :(得分:3)

这恰好是unexpected behavior in ExecuteReader() - 很可能是一个错误。内部ExecuteReader()内部发生了一些随机错误,很可能是网络超时,连接已关闭,然后返回关闭的SqlDataReader,就好像什么也没发生一样。难怪随后对HasRows的调用会产生异常。

答案 1 :(得分:2)

的quickfix 您可以添加一个检查以确定您的连接是否在离开之前打开,如果已关闭则再次打开您的连接

但我建议您在那里添加不错的日志(我很好奇;))

答案 2 :(得分:1)

我担心您上面的评论,每次都没有创建连接。让连接池担心开销。您应该每次都创建一个连接。创建连接,执行读取,销毁连接。长期存在的连接可能会在服务器之间丢弃通信时出现间歇性问题(只需要超时或少量丢弃数据包)。

答案 3 :(得分:0)

您是否在任何地方声明了DataReader ????

此外,如果你有BeginTransaction()函数,那么这个函数应该具有你想要执行什么类型的命令的功能,即executeReader,ExecuteNonQuery等。首先检查你的读者:

ISReading...

然后继续阅读.hasRow。

DataReader还存储一个完整的表,因此您应该检查Tables [0] .rows