0

サポートしている古いアプリがあり、次のSharedSQLConnectionに遭遇しました。

    private static SqlConnection cnSQL = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString.ToString());
    private static SqlCommand cmdSQL = new SqlCommand();

これで、この接続は必要になるたびに開閉されますが、それでも散発的なエラーが発生します。これは、ユーザー間で共有されている(静的である)ためだと思います。私の仮定は正しいですか?クラスごとに接続するのではなく、それを必要とする各メソッド内に新しい接続を作成する方がはるかに良いと思います。または、静的オプションを削除して、ページごとに1つの接続を維持し、ユーザー間の汚染について心配する必要がないようにすることはできますか?

ありがとう

4

4 に答える 4

3

両方を取り除き、必要なときに宣言して定義します。

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString.ToString()))
{
    using (var cmd = conn.CreateCommand())
    { ... }
}

この答えを読んでください。

于 2012-11-12T17:51:19.430 に答える
1

static2つのクエリを同時に実行しようとすると、確かに悪いことが起こる可能性があります。

それを使用する各メソッドで新しい接続を作成Disposeし、最後に私の望ましいアーキテクチャになります。SqlConnectionまた、ファクトリメソッドでの作成をカプセル化します。

于 2012-11-12T17:51:03.190 に答える
1

静的メンバーは、アプリケーションの実際のインスタンス内のコードのすべてのオブジェクトとメソッド間で共有されますが、異なるユーザー間では共有されません。

接続文字列を静的にしますが、接続自体は作成しません。あなたが言うように、各メソッドで新しい接続を開きます。接続プーリングにより、物理接続が開いたままになります。

public static readonly string ConnectionString connString =
    ConfigurationManager.ConnectionStrings["SQL"].ConnectionString.ToString();

..。

private void SomeMethod()
{
    using (var conn = new SqlConnection(connString)) {
        string sql = "SELECT ...";
        using (var cmd = new SqlCommand(sql, conn)) {
            ...
        }
    }
}

using-statementsにコードを埋め込んでいることを確認してください。そうすれば、例外が発生した場合でもリソースが解放されます。

于 2012-11-12T17:51:33.703 に答える
0

恐れ入りますが、実行関数を呼び出す直前に接続を開始し、結果が失敗したかどうかに関係なく、実行直後に接続を閉じる必要があります。割り当てられたリソースを適切なタイミングで閉じて破棄すれば、静的であってもそうでなくても違いはありません。接続を開始するための最良のパターンは、以下のコードです。

SqlCommand command = new SqlConnection("[The connection String goes here]").CreateCommand();

try
{
    command.Parameters.Add(new SqlParameter() { ParameterName = "ParameterA", Direction = ParameterDirection.Input, Value = "Some value" });

    command.Parameters.Add(new SqlParameter() { ParameterName = "ReturnValue", Direction = ParameterDirection.ReturnValue });

    command.CommandText = "[YourSchema].[YourProcedureName]";

    command.CommandType = CommandType.StoredProcedure;

    command.Connection.Open();

    command.ExecuteNonQuery();
}
catch (Exception ex)
{
    //TODO: Log the exception and return the relevant result.
}
finally
{
    if (command.Connection.State != ConnectionState.Closed)

        command.Connection.Close();

    SqlConnection.ClearPool(command.Connection);

    command.Connection.Dispose();

    command.Dispose();
}

それが役に立てば幸い。

乾杯

于 2012-11-12T18:26:18.337 に答える