16

異なるテーブルで複数のSELECTクエリを実行したい場合、それらすべてに同じSqlDataReaderとSqlConnectionを使用できますか?次は賢明でしょうか?(私はこれを速くタイプしたので、try / catchがありません):

MySqlCommand myCommand = new MySqlCommand("SELECT * FROM table1", myConnection);

myConnection.Open();
SqlDataReader myDataReader = myCommand.ExecuteReader();

while(myReader.Read())
{
    //Perform work.
}

myCommand.commandText = "SELECT * FROM table2";

myReader = myCommand.ExecuteReader();

while(myReader.Read())
{
    //Perform more work
}

myReader.Close();
myConnection.Close();

どうもありがとう。

4

2 に答える 2

28

異なるスレッドからの同じ接続で複数のクエリを同時に実行しようとしない限り、それぞれに同じ接続を使用できます。

データリーダーに関しては、実際にリーダーを再利用しているわけではありません。を呼び出すたびExecuteReaderに、新しいリーダーの新しいインスタンスが返されます。再利用しているのは、リーダーへの参照を維持する変数だけです。ここに問題があります。最後のリーダーを明示的に閉じて、後で最初のリーダーをGCするだけです。

コマンドを再利用することもできますが、パラメーターなどを指定する場合は、次のクエリにも適用されない限り、次のクエリのためにそれらをクリアする必要があることに注意してください。

ブロックを使用try/finallyしてリソースを確実にクリーンアップする必要があります。または、コードをすばやく変更してusing、残りのコードの実行を妨げる例外がある場合でも、ステートメントを使用してリソースのクリーンアップを確実に行うようにします。

using (var myConnection = GetTheConnection())
{
  myConnection.Open();

  var myCommand = new MySqlCommand("SELECT * FROM table1", myConnection))
  using (var myDataReader = myCommand.ExecuteReader())
  {
    while(myReader.Read())
    {
      //Perform work.
    }
  } // Reader will be Disposed/Closed here

  myCommand.commandText = "SELECT * FROM table2";
  using (var myReader = myCommand.ExecuteReader())
  {
    while(myReader.Read())
    {
      //Perform more work
    }
  } // Reader will be Disposed/Closed here
} // Connection will be Disposed/Closed here

注:GetTheConnectionこれは、接続インスタンスを取得するために使用しているメカニズムの単なるプレースホルダー関数です。

于 2012-04-13T19:22:26.037 に答える
2

私は通常アダプターを使用しているので、リーダーの詳細についてはさびていますが、あなたは正しい方向に進んでいると思います。

コードで注意すべき点の1つは、を呼び出すたびExecuteReaderに新しいデータリーダーが生成されることです。変数名を再利用している可能性がありますが、既存のリーダーへの参照は破棄され、呼び出しごとに新しいリーダーに置き換えられます。つまり、ExecuteReaderを使用して新しいリーダーを取得する前に、前のリーダーを閉じてください。

于 2012-04-13T19:29:03.197 に答える