2012-03-30 12 views
0

だから、タイトルラインごとにエラーが出ます。かなり自明のようですが、私の理解は、 "使用"ブロック内のオブジェクトは処分されているということですか?このエラーは、別のマイナーなバグがコードの実行を中断した後に表示されるため、私は閉じているかシャットダウンする必要のあるオープンリーダーに悩まされていますか?どんな助けもありがたいですか?C#/ SQL Serverエラー 'このコマンドに関連付けられている開いているDataReaderは既にありますが、最初に閉じる必要があります。'

public override long GetStatsBenchmark(String TableName) 
{ 
    using (SqlCommand cmd = new SqlCommand("sprocReturnDataPointBenchmark", this.sqlConnection)) 
    { 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     SqlParameter outputParameter = new SqlParameter 
     { 
      ParameterName = "@benchmark", 
      Direction = System.Data.ParameterDirection.Output, 
      SqlDbType = System.Data.SqlDbType.BigInt, 
     }; 
     cmd.Parameters.Add(outputParameter); 
     SqlParameter inputParameter = new SqlParameter 
     { 
      ParameterName = "@tblName", 
      Direction = System.Data.ParameterDirection.Input, 
      SqlDbType = System.Data.SqlDbType.NVarChar, 
      Value = TableName 
     }; 
     cmd.Parameters.Add(inputParameter); 
     cmd.ExecuteNonQuery(); 

     return (long)outputParameter.Value; 
    } 
} 
+0

デバッグ時に再現性がありますか? –

+0

@ブライアン私は、同じエラーを再実行、エラーでそれを停止しています。私はcmd.Disposeをデバッグしている間に無駄にしようとしました。 – StatsViaCsh

+0

これに影響を与える可能性のある別の場所で 'this.sqlConnection'と何かしていますか?コード内の別のコマンドオブジェクトが同じ 'SqlConnection'を使用している可能性があり、まだ閉じられていないようです。 –

答えて

1

あなたが表示したコードが問題の原因ではないと思います。 SqlCommandIDbCommand)のオブジェクトを処分することが推奨されますが、実際には必要であるとは考えていません。 の場合は、使用後にSqlDataReaderIDataReader)個のオブジェクトを処分する必要があります。エラーメッセージが示唆しているように、コード内で処理されていないSqlDataReaderオブジェクトの使用法を探します。表示されているコードから例外がスローされる可能性がありますが、その原因は、先に実行されたプログラムの実行で使用された同じSqlConnectionに関連付けられているSqlDataReaderが原因であると考えられます。

+0

その通りその通り。ありがとう。私は40 +のうちのオープンな参照を発見したとは思わなかった。 – StatsViaCsh

1

using節の問題は、コンパイラが生成する暗黙のtry/finallyブロックで例外を処理する方法を提供しないことです。

1)try/catchまたは でusing句をラップします。2)finallyブロックでDisposeを呼び出し、catchブロックで例外処理を追加する代わりに、try/catch/finallyを手作業でコーディングします。

あり手法のいずれかにわずかな欠点がありますが、どちらかは、あなたが同時に複数のレコード(または類似)のオープンを許可するように、接続文字列にMARS(複数のアクティブな結果セット)を追加することができます

+0

より堅牢な実装のアイデアをありがとう。 – StatsViaCsh

0

に動作します。

接続文字列(http://www.connectionstrings.com/sql-server-2008)に

MultipleActiveResultSets=true; 

または

MARS Connection=True; 

を追加し、これが複数のハンドルを許可しますが、もし前の操作が例外で「中断」されている場合は、「USING」を使用しないでください。または、内部でtry/catchを使用してください。

関連する問題

 関連する問題