3

私はこのコードを持っています:

// 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% 確信しています。私のコードは、 MSDN が示唆するようHasRowsに、リーダーから読み取る前に使用します。

その例外の理由は何でしょうか?

4

4 に答える 4

4

これは予期しない動作でExecuteReader()あり、バグである可能性が最も高いです。ネットワークのタイムアウトなどのランダムなエラーが内部でExecuteReader()発生し、接続が閉じSqlDataReaderられ、何も起こらなかったかのようにクローズが返されます。その後の への呼び出しHasRowsで例外が発生するのも不思議ではありません。

于 2013-01-10T10:00:27.267 に答える
2

クイックフィックスを追加して、ハッシュの前に接続が開いているかどうかを確認し、閉じている場合は接続を再度開くことができます

しかし、そこにもまともなログを追加することをお勧めします(興味があります;))

于 2012-12-20T10:16:56.270 に答える
1

毎回接続を作成していないという上記のコメントが心配です。接続プーリングにオーバーヘッドを心配させてください。毎回接続を作成する必要があります。接続を作成し、読み取りを行い、接続を破棄します。長時間の接続では、サーバー間で通信がドロップされるという断続的な問題が発生する可能性があります (タイムアウトまたはいくつかのパケットのドロップのみが必要です)。

于 2012-12-20T11:34:35.267 に答える
0

DataReader をどこかで宣言しましたか????

また、BeginTransaction() 関数を使用している場合、この関数には、実行するコマンドの種類、つまり executeReader、ExecuteNonQuery などの機能が必要です。最初にリーダーをチェックインします。

ISReading...

次に、reader.hasRow に進みます。

また、DataReader は完全なテーブルを格納するため、Tables[0].rows を確認する必要があります。

于 2012-12-20T09:03:51.353 に答える