4

このような構造を使用するときに、open DataReader例外(「このコマンドに関連付けられた開いているDataReaderがすでにあり、最初に閉じる必要があります。」)を回避できますか?

public void FirstMethod()
{
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "...";
        using (var reader = command.ExecuteReader())
        {
            // do something with the data
            SecondMethod();
        }
    }
}

public void SecondMethod()
{
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "...";
        using (var reader = command.ExecuteReader()) // Exception
        {
        }
    }
}

よろしくお願いします

4

2 に答える 2

3

ローカル接続を使用できます(つまり、メソッドに対してローカル)。接続プールを使用すると、接続をフィールドとして維持することの利点は最小限に抑えられ、定期的にこのタイプの...楽しいものになります。もちろん、データを編集している場合は、ブロックの問題が発生する可能性があります。おそらく、などを使用して軽減できますTransactionScope。下部の例...

または、接続でMARS(複数のアクティブな結果セット)を有効にすることもできます。それはそれをする必要があります。接続文字列(SQL Server 2005以降)にペアとして「MultipleActiveResultSets=True」を含めるだけです。

public void FirstMethod() {
    using (var connection = CreateAndOpenConnection())
    using (var command = connection.CreateCommand()) {
        command.CommandText = "...";
        using (var reader = command.ExecuteReader()) {
            // do something with the data
            SecondMethod();
        }
    }
}
public void SecondMethod() {
    using (var connection = CreateAndOpenConnection())
    using (var command = connection.CreateCommand()) {
        command.CommandText = "...";
        using (var reader = command.ExecuteReader()) // Exception
        { }
    }
}
private SqlConnection CreateAndOpenConnection() {
    var conn = new SqlConnection(connectionString);
    conn.Open(); // perhaps dispose if this fails...
    return conn;
}
于 2009-09-01T11:40:28.693 に答える
-2

メソッドのシグネチャを変更してみませんか?

public void FirstMethod()
{
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "...";
        using (var reader = command.ExecuteReader())
        {
            // do something with the data
            SecondMethod(reader);
        }
    }
}

public void SecondMethod(var reader)
{
    // do stuff with reader...
}

これにより、問題が回避されるだけでなく、2ではなく1 command/のみを作成するため、オーバーヘッドが少なくなりますreader(これは、メソッド呼び出しが同期していることを前提としています)。

また、varキーワードの代わりに強い型の変数を使用することを検討してください。var匿名タイプをサポートするために導入されたものであり、必要な場合にのみ使用する必要があります。

于 2009-09-01T11:50:00.203 に答える