1

このasp.netコードに何か問題があるかどうか知りたいです:

mydatareader = mycmd.executeReader()
if myDataReader.HasRow then
      // Do something
end if
myConnection.Close()

「MyDataReader.Close()」を呼び出さないようにすると、接続は閉じますか? 「MyConn.Close」を呼び出すと、関連するデータリーダーが自動的に閉じられると想定しているため、これを尋ねます...または間違っていますか?

ありがとう

4

4 に答える 4

3

このような操作を実行するためのベスト プラクティスは次のとおりです。

using(SqlConnection connection = new SqlConnection(connStr)) {
    connection.Open();

    SqlCommand command = new SqlCommand(connection, "SELECT...");
    SqlDataReader reader = command.ExecuteReader();
    // Fill your container objects with data
}

usingステートメント:

1 つまたは複数のオブジェクトが破棄される範囲外のスコープを定義します。

したがって、 usingブロックを終了するときに、変数と変数が閉じられ、それに応じて破棄されるconnectionことが保証されます。commandreader

于 2010-05-17T15:35:11.380 に答える
3

接続を閉じるのではなく、リーダーを閉じる必要があります。ここを見てください: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close.aspx

于 2010-05-17T15:36:08.773 に答える
0

よくわかりませんが、db アクションには常に try-catch-finally ブロックを使用しています。

using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
    using (SqlCommand cmmnd = new SqlCommand("SELECT Date();", cnn))
    {
        try
        {
            cnn.Open();
            using (SqlDataReader rdr = cmmnd.ExecuteReader())
            {
                if (rdr.Read()) { result = rdr[0].ToString(); }
            }
        }
        catch (Exception ex) { LogException(ex); }
        finally { cnn.Close(); }
    }
}
于 2010-05-17T20:48:29.240 に答える
0

データ リーダーも接続も閉じていない場合は、ガベージ コレクターが自動的に閉じます。一方で、これはアプリケーションのパフォーマンスに影響を与える可能性があります。

于 2010-05-17T15:35:59.553 に答える