7

データベース スキーマ情報を取得するために特定のクエリを実行する必要がある単純なアプリケーションがあります。クエリを実行してリーダーを返す簡単なメソッドを作成しました。次のようなものです-

public static DbDataReader ExecuteQuery(DbConnection connection,string sql)
{
   DbCommand command = connection.CreateCommand();
   command.CommandText = sql;

   using(command)
   {
      return command.ExecuteReader();    
   }
}

呼び出しコードは接続を閉じ、リーダーと接続を適切に破棄します。

私の質問 - リーダーを反復する前に、(using ブロックを介して行われるように) コマンド インスタンスを破棄することは問題ありませんか? リーダーを閉じた後に OUT パラメータが入力されるとは思いません。ADO.NET API には、これに関する厳密なガイドラインはありますか?

4

1 に答える 1

0

メソッドコマンドでusingブロックを離れると、コマンドは閉じられて破棄されます。呼び出し元からリーダーを使用できる場合は、それが引き続き機能することを意味します。

コマンドは、接続に対してステートメントを実行するための手段ですが、データを保持しません。これが、これが機能する理由です。接続が開いている限り、リーダーを使用できます。

PS。ExecuteReaderの優れたオーバーロードもあり、接続を破棄するときに直接接続を閉じるようにReaderに指示します。これは、コマンドのようにローカルで接続が作成され、外部から渡されない場合に便利です。

于 2011-10-21T07:00:37.637 に答える