2012-12-20 46 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

我很擔心上面,你是不是每次都創建一個連接您的評論。讓連接池擔心開銷。您應該每次都創建一個連接。創建連接,執行讀取操作,銷燬連接。長期連接可能會在服務器之間斷開通信時發生間歇性問題(所需時間僅爲超時或少量丟包)。

相關問題