|
■No45295 (匿名 さん) に返信
> da1 = New OleDb.OleDbDataAdapter(strSQL, cn)
> da2 = New OleDb.OleDbDataAdapter(strSQL, cn)
テーブルが異なるので strSQL は同じではいけないです。
それぞれのテーブルに対する SQL をセットしてください。
> .BeginTransactionと.commitは対にしなければいけませんよね?
> となると、どう対処したら良いのかがわかりません…
BeginTransaction にて Transaction オブジェクトを作成して、それぞれのコ
マンドにセットしてください。
Dim cnTran As OleDbTransaction = cn.BeginTransaction(IsolationLevel.ReadCommitted)
da1.InsertCommand.Transaction = cnTran
da2.InsertCommand.Transaction = cnTran
オブジェクトの破棄を保証するために Using 句を用いるとこんな感じです。
Using cnTran As OleDbTransaction = cn.BeginTransaction(IsolationLevel.ReadCommitted)
...
da1.InsertCommand.Transaction = cnTran
da2.InsertCommand.Transaction = cnTran
...
End Using
記述の仕方の話です。
変数 dRow にテーブル1の新規行、テーブル2の新規行をセットしていますが
dRow = ds.Tables("テーブル1").NewRow
dRow = ds.Tables("テーブル2").NewRow
可読性を考えると別の変数を用意したほうが善いです。
Dim newRow1 As DataRow = ds.Tables("テーブル1").NewRow()
Dim newRow2 As DataRow = ds.Tables("テーブル2").NewRow()
変数 cBuilder も同じようにテーブル1用、テーブル2用にそれぞれの変数を作成し
てインスタンスをセットした方が善いです。
Dim commandBuilder1 As New OleDbCommandBuilder()
commandBuilder1.DataAdapter = da1
da1.InsertCommand = commandBuilder1.GetInsertCommand()
Dim commandBuilder2 As New OleDbCommandBuilder()
commandBuilder2.DataAdapter = da2
da2.InsertCommand = commandBuilder2.GetInsertCommand()
行数は増えますが、変数がテーブル1の状態かテーブル2の状態かを気にする
必要がなくなるので、処理に着目してコードを整理することが出来ます。
そうすることで、トランザクションが行われている場所を明確に出来ますし、
メソッドの分割もやりやすくなるかと思います。
' データベースからデータを取得する処理
Dim da1 As New OleDb.OleDbDataAdapter("...", cn)
da1.Fill(ds, "テーブル1")
Dim da2 As New OleDb.OleDbDataAdapter("...", cn)
da2.Fill(ds, "テーブル2")
' 新規データを作成する処理
Dim newRow1 As DataRow = ds.Tables("テーブル1").NewRow()
newRow1("フィールド") = "値"
ds.Tables("テーブル1").Rows.Add(newRow1)
Dim newRow2 As DataRow = ds.Tables("テーブル2").NewRow()
newRow2("フィールド") = "値"
ds.Tables("テーブル2").Rows.Add(newRow2)
' データベースを更新する処理
Dim commandBuilder1 As New OleDbCommandBuilder()
commandBuilder1.DataAdapter = da1
da1.InsertCommand = commandBuilder1.GetInsertCommand()
Dim commandBuilder2 As New OleDbCommandBuilder()
commandBuilder2.DataAdapter = da2
da2.InsertCommand = commandBuilder2.GetInsertCommand()
Using cnTran As OleDbTransaction = cn.BeginTransaction(IsolationLevel.ReadCommitted)
da1.InsertCommand.Transaction = cnTran
da2.InsertCommand.Transaction = cnTran
Try
da1.Update(ds, "テーブル1")
da2.Update(ds, "テーブル2")
cnTran.Commit()
Catch e As Exception
cnTran.Rollback()
End Try
End Using
|