1

わかりました、これは些細なことですが、私を悩ませています。私はこのようなコードを持っています

oCmd = new SqlCommand("getBooking", oCon); 
oCmd.CommandType = CommandType.StoredProcedure;
oRs = oCmd.ExecuteReader();
do while (oRs.Read()) {
    // do stuff
}
oRs.Close();
oCmd.Dispose();

しかしDispose、次のExecuteReaderように移動できますか:

oCmd = new SqlCommand("getBooking", oCon); 
oCmd.CommandType = CommandType.StoredProcedure;
oRs = oCmd.ExecuteReader();
oCmd.Dispose();
do while (oRs.Read()) {
    // do stuff
}
oRs.Close();

試してみましたが、うまくいきますが、いたずらをしているように感じます. このアプローチに落とし穴はありますか?SqlCommand内でオブジェクトを再利用する必要がしばしばあり、複数のオブジェクトdo whileを作成したくないためです。SqlCommand

4

3 に答える 3

5

はい、使い終わったらすぐにオブジェクトを破棄することをお勧めします。コマンドを再利用する利点はまったくなく、そのためにコードが複雑になり、理解と保守が難しくなる可能性があります。

using次の構文を使用することをお勧めします。

using (var oCmd = new SqlCommand("getBooking", oCon))
{
    oCmd.CommandType = CommandType.StoredProcedure;
    using (var oRs = oCmd.ExecuteReader())
    {        
        while (oRs.Read()) {
            // do stuff
        }
    }
}

using使い捨てオブジェクト (実装IDisposable) で使用すると、メソッドDisposeは を呼び出しますClose。に対しても同じことができますSqlConnection

于 2013-10-31T03:27:42.763 に答える
0

「using ブロック」を使用しているときはいつでも、connection.close または connection.dispose は必要ありません。CA2202 に従って、オブジェクトを複数回破棄するべきではありません

于 2013-10-31T06:05:39.457 に答える