トランザクションの実行手順
- トランザクションを開始する
- SqlCommand.Transactionnにトランザクションを割り当てる。
- トランザクションを実行またはキャンセルする。
トランザクションを実行した場合、データベースの更新は完了します。
トランザクションをキャンセルした場合はトランザクションを開始してからキャンセルの直前までのデータベースの更新処理は実行されません。
使用例:Nullを許容しない列にNullを入れ例外を発生させ、例外発生以前のデータベースの更新処理をキャンセルします。
商品マスタのテーブル定義
Imports System.Data.SqlClient Module Module1 Sub Main() Dim con As New SqlConnection 'DB接続 con.ConnectionString = "Data Source=localhost\SQLEXPRESS;Initial Catalog=SAMPLE_DB;Integrated Security=True" con.Open() 'トランザクションの開始 Dim tran As SqlTransaction = Nothing tran = con.BeginTransaction 'SqlDataAdapter Dim da As New SqlDataAdapter() Try 'SelectComman設定 da.SelectCommand = New SqlCommand da.SelectCommand.Connection = con da.SelectCommand.CommandText = "SELECT NO, T_SALES.ITEM_CD AS ITEM_CD, ITEM_NM, PRICE, UNIT_SALES, SALES_AMOUNT " _ + "FROM M_ITEM INNER JOIN T_SALES ON M_ITEM.ITEM_CD = T_SALES.ITEM_CD" 'トランザクションの設定 da.SelectCommand.Transaction = tran 'InsertCommand設定 da.InsertCommand = New SqlCommand da.InsertCommand.Connection = con da.InsertCommand.CommandText = "INSERT INTO T_SALES(ITEM_CD, UNIT_SALES, SALES_AMOUNT) VALUES (@ITEM_CD, @UNIT_SALES, @SALES_AMOUNT)" 'パラメータ設定 da.InsertCommand.Parameters.Add("@ITEM_CD", SqlDbType.NVarChar, 4, "ITEM_CD") da.InsertCommand.Parameters.Add("@UNIT_SALES", SqlDbType.Decimal, 8, "UNIT_SALES") da.InsertCommand.Parameters.Add("@SALES_AMOUNT", SqlDbType.Decimal, 8, "SALES_AMOUNT") 'トランザクションの設定 da.InsertCommand.Transaction = tran 'UpdateCommand設定 da.UpdateCommand = New SqlCommand da.UpdateCommand.Connection = con da.UpdateCommand.CommandText = "UPDATE T_SALES SET ITEM_CD = @ITEM_CD, UNIT_SALES = @UNIT_SALES, SALES_AMOUNT = @SALES_AMOUNT WHERE NO = @NO" 'パラメータ設定 da.UpdateCommand.Parameters.Add("@ITEM_CD", SqlDbType.NVarChar, 4, "ITEM_CD") da.UpdateCommand.Parameters.Add("@UNIT_SALES", SqlDbType.Decimal, 8, "UNIT_SALES") da.UpdateCommand.Parameters.Add("@SALES_AMOUNT", SqlDbType.Decimal, 8, "SALES_AMOUNT") da.UpdateCommand.Parameters.Add("@NO", SqlDbType.Decimal, 8, "NO") 'トランザクションの設定 da.UpdateCommand.Transaction = tran 'DeleteCommand設定 da.DeleteCommand = New SqlCommand da.DeleteCommand.Connection = con da.DeleteCommand.CommandText = "DELETE FROM T_SALES WHERE NO = @NO" 'パラメータ設定 da.DeleteCommand.Parameters.Add("@NO", SqlDbType.Decimal, 8, "NO") 'トランザクションの設定 da.DeleteCommand.Transaction = tran 'DataSet Dim ds As New DataSet 'データを取得 da.Fill(ds, "T_SALES") 'テーブルを取得 Dim dt As DataTable = ds.Tables("T_SALES") 'レコード変更 dt.Rows(0)("SALES_AMOUNT") = 11111 dt.Rows(1)("SALES_AMOUNT") = 11111 dt.Rows(2)("SALES_AMOUNT") = 11111 dt.Rows(3)("SALES_AMOUNT") = DBNull.Value '例外を発生 dt.Rows(4)("SALES_AMOUNT") = 11111 dt.Rows(5)("SALES_AMOUNT") = 11111 dt.Rows(6)("SALES_AMOUNT") = 11111 dt.Rows(7)("SALES_AMOUNT") = 11111 'データ更新 da.Update(ds, "T_SALES") 'トランザクションの実行 tran.Commit() Console.WriteLine("データを更新しました") Catch ex As Exception Console.WriteLine(ex.ToString) 'トランザクションをキャンセル If tran IsNot Nothing Then tran.Rollback() End If Console.WriteLine("データの更新を取消しました") Finally '接続を閉じる If Not con.State = ConnectionState.Closed Then con.Close() End If 'リソースの解放 da.Dispose() tran.Dispose() con.Dispose() End Try End Sub End Module
実行結果:データは変更されていない |
0 件のコメント:
コメントを投稿