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 プロパティがまだ初期化されていません。」
とでます。
以前質問した項目と多少被るのですが、質問させていただきます。
タイトルの通り、トランザクション処理を入れたいのですが、どうしてもできません。
もしわかる方いましたら、ご教授お願いします。
プログラムの内容は、マスタ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 プロパティがまだ初期化されていません。」
とでます。
adapter.Fill(table)をBeginTransactionの前にすれば解消されませんか?
未検証です、申し訳ありません。