2011-01-26 7 views
1

MySqlDataReaderを終了する際に問題が発生しています。これは、.Close()コマンドがハングアップしたようです。誰もこれを回避する方法を知っていますか?MySqlDataReaderを閉じる問題

static void Main(string[] args) 
    {       
     MySqlConnection cn = new MySqlConnection("SERVER=svr;DATABASE=db;UID=uid;PASSWORD=pwd;"); 
     cn.Open(); 

     MySqlCommand cmd = new MySqlCommand("SELECT * FROM SOMETABLE", cn); 
     MySqlDataReader dr = cmd.ExecuteReader(); 
     int ii = 0; 

     while (dr.Read()) 
     { 
      Console.WriteLine(dr.GetValue(1).ToString()); 
      if (ii++ > 10) break;      
     } 
     dr.Close(); 
     cn.Close(); 
    } 

**注:静的オブジェクトを使用しないようにコードを変更しました。それはまだ.Close()でハング

答えて

1

は、静的接続、コマンド、および読者オブジェクトの共有に関連していることがあります。それがこの特定の問題の原因ではないとしても、それをしないことは非常に良い考えです。

ローカル接続、コマンド、およびリーダー変数を使用する必要があります。できるだけ遅く作成してください。可能な限り早く閉じてください。

static void Main(string[] args) 
{ 
    using (var conn = new MySqlConnection("...")) 
    using (var cmd = new MySqlCommand("...", conn)) 
    { 
     conn.Open(); 
     using (MySqlDataReader dr = cmd.ExecuteReader()) 
     { 
      while (dr.Read()) 
      { 
       // do something 
      } 
     } 
    } 
} 
+0

どちらにしても問題ありません。それはまだ.Close(); – carny666

2

私が使用してキーワードを使用したい:

Using dr As MySqlDataReader = cmd.ExecuteReader() 
... 
End Using 

(VBの構文については申し訳ありません)

を編集:あなたが呼び出す場合、あなたはより速く閉じる操作を得ることができますCloseを呼び出す前に、コマンドでキャンセルします。とにかくあなたのクローズの動作は奇妙な問題です。

dr.Cancel(); 
dr.Close(); 
cn.Close(); 

EDIT2:私はあなたがキャンセル呼び出し、その理由は、あなたの「休憩」命令であれば問題が解決されることを発見したより多くの研究を行っています。出典:。http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=610

「プログラムぶら下げ理由はSqlDataReader.Closeメソッドは、出力パラメータ、戻り値とと、RecordsAffectedの値を記入することで、あなたはそれがすべてのレコードを読んだ前にリーダーを閉じようとした場合、 Closeは、すべてのデータを読み込み、それらの値を書き込もうとします。これらの値を気にしないで、読み込みループから抜け出せない場合は、Closeを呼び出す前に基本コマンドを取り消す必要があります。上記の場合、あなたがしたいのは、ループを終了する直前にcommand.Cancelを呼び出すことです。

+0

良いアドバイスを、しかし、OPの問題におそらくない解決策:

代わりにこれを試してみてください。 – LukeH

+0

一般的には良い練習ではありますが、私はこの特定の問題のためにどのように違いが出るか分かりません。 – BrokenGlass

+0

@ LukeH:これはまったく正しい答えです。 Vulkaninoは 'dr.Close()'がハングする理由を説明します。はい、彼はすべての 'IDispose'オブジェクトを' using'ブロックに入れるべきですが、SQLクエリを変更するか、代わりに 'break'を使う代わりにLinqを使うことを検討するべきです。 – JohnB

関連する問題