トランザクション処理によりデータベースの更新を完了またはキャンセルします。
トランザクションの実行手順
- トランザクションを開始する
- SqlCommand.Transactionnにトランザクションを割り当てる。
- トランザクションを実行またはキャンセルする。
トランザクションを実行した場合、データベースの更新は完了します。
トランザクションをキャンセルした場合はトランザクションを開始してからキャンセルの直前までのデータベースの更新処理は実行されません。
使用例:Nullを許容しない列にNullを入れ例外を発生させ、例外発生以前のデータベースの更新処理をキャンセルします。
商品マスタのテーブル定義
| | | | | | | |
| インスタンス名 | SQLEXPRESS | データベース名 | SAMPLE_DB |
| 論理テーブル名 | 商品マスタ | 物理テーブル名 | M_ITEM |
| 列定義 |
| No | 論理名 | 物理名 | データ型 | Nullを許容 | 主キー |
| 1 | 商品CD | ITEM_CD | nvarchar(4) | No | Yes |
| 2 | 商品名 | ITEM_NM | nvarchar(32) | No | |
| 3 | 単価 | PRICE | numeric(8,0) | No | |
商品マスタのテーブルデータ
売上データのテーブル定義
| | | | | | | |
| インスタンス名 | SQLEXPRESS | データベース名 | SAMPLE_DB |
| 論理テーブル名 | 売上データ | 物理テーブル名 | T_SALES |
| 列定義 |
| No | 論理名 | 物理名 | データ型 | Nullを許容 | 主キー |
| 1 | NO | NO | numeric(8,0) | No | Yes |
| 2 | 商品CD | ITEM_CD | nvarchar(4) | No | |
| 3 | 売上数 | UNIT_SALES | numeric(8,0) | No | |
| 4 | 売上額 | SALES_AMOUNT | numeric(8,0) | No | |
売上データ
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
|
実行結果:データは変更されていない |