SQLのトランザクション処理について

タグの編集
投稿者 まる  (社会人) 投稿日時 2009/3/24 01:44:17
いつもお世話になっております。

以前質問した項目と多少被るのですが、質問させていただきます。

タイトルの通り、トランザクション処理を入れたいのですが、どうしてもできません。

もしわかる方いましたら、ご教授お願いします。

プログラムの内容は、マスタ1のすべての列をそのままマスタ2の同じ列へコピーしています。

'接続先は同じです。
    cn1 = DBBase.GetConnection
    cn2 = DBBase.GetConnection

    Public Sub SqlInsert()

        Dim myTran As SqlClient.SqlTransaction
        Dim adapter As New SqlClient.SqlDataAdapter(command1)
        Dim table As New DataTable

        'マスタ1
        With command1

            .Connection = cn1
            .CommandType = CommandType.StoredProcedure
            .CommandText = "ストアドプロシージャ名1"
            .Parameters.Clear()

        End With

        myTran = cn2.BeginTransaction

        'マスタ2
        With command2

            .Connection = cn2
            .Transaction = myTran
            .CommandType = CommandType.StoredProcedure
            .CommandText = "ストアドプロシージャ名2"
            .Parameters.Clear()

        End With

        adapter.Fill(table)←ここでエラー

        Try

            For Each row As DataRow In table.Rows

                For i As Integer = 0 To 18
                    command2.Parameters.AddWithValue("@Parameter" + CStr(i), row(i))
                Next

                command2.ExecuteScalar()

            Next

            myTran.Commit()

            MsgBox("データコピーは成功しました。", MsgBoxStyle.Information, "成功")

        Catch ex As Exception

            myTran.Rollback()

            MsgBox(ex.Message + vbCrLf + "よって、データコピーに失敗しました。", MsgBoxStyle.Critical, "失敗")

        End Try

        adapter.Dispose()
        table.Dispose()
        command1.Dispose()
        command2.Dispose()

    End Sub

エラーメッセージは、
「ExecuteReader は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまだ初期化されていません。」
とでます。
投稿者 通りすがり  (社会人) 投稿日時 2009/3/26 07:52:09
エラーの箇所(adapter.Fill(table))ではcommand1を使用していますが、このcommand1にトランザクションが設定されていないからではないでしょうか?
adapter.Fill(table)をBeginTransactionの前にすれば解消されませんか?
未検証です、申し訳ありません。