none
DataAdapterでのTransactionがうまくいきません RRS feed

  • 質問

  • いつもすいません。
    以下のTransactionを行っていますが、1回目は正常に処理されるのですが、2回目を呼び出すと「System.InvalidOperationException」エラーが発生します。
    いろいろ見たのですが回避できません。アドバイスをいただけませんでしょうか。

            Using npgBuilder As Npgsql.NpgsqlCommandBuilder = New Npgsql.NpgsqlCommandBuilder(npgDataAdapter)
                Using npgTrans As NpgsqlTransaction = Cnn.BeginTransaction(IsolationLevel.Serializable) <--ここでエラー
                    Try
                        If Cnn.State = ConnectionState.Closed Then
                            Cnn.Open()
                        End If
                        Dim tempRow = npgDataSet.Tables("T_Zip").Select("ZipCode=123-0000" )

                        tempRow(0).BeginEdit()
                        tempRow(0).Item("ZipCode") = "123-0001"
                        tempRow(0).Item("Address") = "TEST"
                        tempRow(0).EndEdit()

                        npgBuilder.GetUpdateCommand.Connection = Cnn
                        npgBuilder.GetUpdateCommand.Transaction = npgTrans

                        npgDataAdapter.Update(npgDataSet.Tables("T_Zip"))

                        npgTrans.Commit()
                    Catch edbc As DBConcurrencyException
                        ’/* Error Message */
                    Catch esql As SqlClient.SqlException
                        ’/* Error Message */
                    Catch ex As NpgsqlException
                        ’/* Error Message */
                    Finally

                        If Not npgTrans.Connection Is Nothing Then
                            npgTrans.Rollback()
                        End If
                        If Not (Cnn.State = ConnectionState.Closed) Then
                            Cnn.Close()
                        End If
                    End Try
                End Using
            End Using

    2010年10月18日 2:35

回答

  • BeginTransaction でトランザクションを開始するまえに、Cnn.Open でコネクションを開いておく必要があります。

    1回目はたまたまコネクションが開いていて成功するが、トランザクションの最後でコネクションを閉じているため、2回目以降失敗しているのではないでしょうか?(試してはいませんが)

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月18日 3:13
  • たぶん2回目はコネクションが閉じているからだと思います。
    ところで全体的にusing句の使い方がしっくりこないのですが、何かを参考にコードを記述されているのでしょうか? 通常、コネクションにはusing句を使用します。以下のコード例を参考にしてみて下さい。また、using句の意味を今一度確認してみて下さい。

    BeginTransaction メソッド ()
    http://msdn.microsoft.com/ja-jp/library/86773566(VS.80).aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月18日 3:13
    モデレータ

すべての返信

  • BeginTransaction でトランザクションを開始するまえに、Cnn.Open でコネクションを開いておく必要があります。

    1回目はたまたまコネクションが開いていて成功するが、トランザクションの最後でコネクションを閉じているため、2回目以降失敗しているのではないでしょうか?(試してはいませんが)

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月18日 3:13
  • たぶん2回目はコネクションが閉じているからだと思います。
    ところで全体的にusing句の使い方がしっくりこないのですが、何かを参考にコードを記述されているのでしょうか? 通常、コネクションにはusing句を使用します。以下のコード例を参考にしてみて下さい。また、using句の意味を今一度確認してみて下さい。

    BeginTransaction メソッド ()
    http://msdn.microsoft.com/ja-jp/library/86773566(VS.80).aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月18日 3:13
    モデレータ
  • OPENはしていると思っていますが

    Tryの中で
    If Cnn.State = ConnectionState.Closed Then
        Cnn.Open()
    End If
    と記述してますが?。

    またコネクションのUSINGは他でも使うため、別の所でOPENした状態で共通して使っているためです。

    よくない方法なのでしょうか。すいません。アドバイスを再度いただけませんか。

    2010年10月18日 4:23
  • Cnn.Openの前にCnn.BeginTransaction(IsolationLevel.Serializable)が実行されるためです。Cnnというコネクションがオープンしていないため、BeginTransactionメソッドの実行で例外が発生しているのだと思われます。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月18日 5:05
    モデレータ
  • あ!そうです。私の勘違いでした。

    初歩的なミスです。すいません。

    皆様の指摘に感謝です。

    2010年10月18日 5:34