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

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 通りすがり  (社会人) 投稿日時 2009/3/26 07:52:09
エラーの箇所(adapter.Fill(table))ではcommand1を使用していますが、このcommand1にトランザクションが設定されていないからではないでしょうか?
adapter.Fill(table)をBeginTransactionの前にすれば解消されませんか?
未検証です、申し訳ありません。
投稿者 まる  (社会人) 投稿日時 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 プロパティがまだ初期化されていません。」
とでます。