0

次のコードを実行すると、

「BeginTransaction にはオープン接続が必要です。接続の現在の状態はオープン、実行中です」

例外。

using (var con = new IBM.Data.DB2.DB2Connection(
                         "Server=localhost;Database=SAMPLE;UID=***;PWD=***;"))
{
    con.Open();
    var c = con.CreateCommand();
    c.CommandText = "select * from DB2TEST";
    using (var r = c.ExecuteReader())
    {
        r.Read();
        con.BeginTransaction();// The exception is thrown here!!!
    }
}

Begin トランザクションをコード内の前の時点に移動すると機能することはわかっていますが、それではうまくいきません。非常に大きなリーダーを繰り返し処理し、必要に応じてトランザクションを開いたり閉じたりする必要があります。

ExecuteResultSet を試しましたが、同じ動作になりました。

4

3 に答える 3

1

これは、接続でデータ リーダーが開いているときにトランザクションを開始しようとしたために発生しています。

いくつかのオプションがあります。

1) 必要なすべてのデータをメモリに読み込み、リーダーを閉じてから、トランザクションを開始します。

2) 2 つの接続を開きます。1 つを読み取り用に、もう 1 つをトランザクションの書き込み用に使用します。

于 2013-03-17T09:39:50.820 に答える
0

行ごとに IU (インテント更新) ロックを作成する更新インテントを使用して選択を行うことができ、それを IX (インテント エクスクルーシブ) に変換することができ、その状態でトランザクションを実行できます。SQLJ を使用すると、これはより簡単になります。

于 2013-03-17T14:50:21.960 に答える