2012-12-20 47 views
2

我有这样的代码:为什么打开连接时会出现“无法尝试在阅读器关闭时调用HasRows”?

// 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

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

+0

它是什么类型的应用程序(f.e。ASP.NET),其中是初始化和声明的连接,是静态的,启用了“Connection-Pooling”,你为什么重用它?我会在使用它的'using-statement'中创建它。 –

+1

你在那时检查了连接的状态是什么? http://msdn.microsoft.com/en-us/library/system.data.connectionstate.aspx –

+0

@astander:不,否则我不会说我99.5%肯定。 – sharptooth

回答

3

这恰好是unexpected behavior in ExecuteReader() - 很可能是一个错误。深入ExecuteReader()发生了一些随机错误,很可能是网络超时,连接关闭,然后关闭SqlDataReader返回,就像什么都没发生一样。难怪随后拨打HasRows会产生一个例外。

0

你是否声明了你的DataReader?

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

ISReading... 

再往前走与reader.hasRow。

而且DataReader的存储全表,所以你应该检查表[0] .rows

+0

Yeap,我宣布它:'使用(var reader = command.ExecuteReader()){' – sharptooth

+0

其他步骤也 – Adiee

2

的quickfix 你可以添加一个检查,看看你的连接是hasrows前开放,如果再次关闭打开的连接

,但我建议你添加体面的记录有太多(我很好奇;))

+0

这恰好是从'ExecuteReader()'内部关闭的连接 - 请参阅我的答案http:// stackoverflow .com/a/14255148/57428和相关问题。 – sharptooth

1

我很担心上面,你是不是每次都创建一个连接您的评论。让连接池担心开销。您应该每次都创建一个连接。创建连接,执行读取操作,销毁连接。长期连接可能会在服务器之间断开通信时发生间歇性问题(所需时间仅为超时或少量丢包)。

相关问题