0

以下のようにデータベース アクセス コードを使用しました。

//gets the connection and create transaction
SqlTransaction transaction = SelectConnection();

try
{
    dsRecordDataset = new DataSet();
    SqlParameter[] param = new SqlParameter[1];
    string[] taleNames = new string[1];
    taleNames[0] = "RecordSet";
    param[0] = new SqlParameter("@Mode", Mode);
    SqlHelper.FillDataset(transaction, CommandType.StoredProcedure, 
                          "spProject", dsRecordDataset, taleNames, param);
    transaction.Commit();
    return dsRecordDataset;
}
catch (Exception ex)
{
    transaction.Rollback();
    throw ex;
}

私が見つけた問題は、接続を閉じたことがないため、接続プールがオーバーフローしてユーザーにエラーが発生することがあります。私は次のことを明確にする必要があります

  1. asp.net の既定の設定に従って接続プールがリセットされるのはいつですか?
  2. トランザクションのコミットは接続と関係がありますか?

try catch ブロックの後に次のコードを使用しようとしました

finally
{
    if (transaction.Connection.State == ConnectionState.Open)
    {
        transaction.Connection.Close();
    }
}

しかし、接続はnullであり、エラーが発生します。

  1. 上記のコードで接続を閉じる方法はありますか?
4

2 に答える 2

1

asp.netのデフォルト設定に従って接続プールがリセットされるのはいつですか?

接続文字列で MinPoolSize が指定されていないか、0 が指定されている場合、プール内の接続は非アクティブ状態が一定期間続くと閉じられます。ただし、指定された MinPoolSize が 0 より大きい場合、AppDomain がアンロードされてプロセスが終了するまで、接続プールは破棄されません。

トランザクションのコミットは接続と関係がありますか? いいえ、接続をコミットしても接続は閉じられません (すべきではありません)。

上記のコードで接続を閉じる方法はありますか?

これは、Connection オブジェクトの Close メソッドまたは Dispose メソッドを使用するか、C# の using ステートメント内ですべての接続を開いて接続プールに返されるようにすることで実行できます。明示的に閉じられていない接続は、プールに追加または返されない可能性があります。

于 2012-08-22T04:11:12.480 に答える
0

答えはわかりましたが、質問 3) については、この場合の using ステートメントが興味深いと思うかもしれません。ただし、これはコードの変更を意味しますが、リソースの重要なオブジェクトを安全に保つための良い方法です。(あなたの SqlConnection のように)

using (SqlConnection connection = new SqlConnection(connectionString))  
{  
    SqlCommand command = connection.CreateCommand();  

    command.CommandText = "mysp_GetValue";  
    command.CommandType = CommandType.StoredProcedure;  

    connection.Open();  
    object ret = command.ExecuteScalar();  
} 

これは非常に単純な例ですが、このステートメントは、IDisposable インターフェイスを実装するオブジェクトの Dispose メソッドを自動的に呼び出します。(SqlConnection のように)

これに興味がある場合は、ここで詳細と説明を見つけることができます: Your Friend the C# Using Statement

于 2012-08-22T06:15:15.807 に答える