2014年1月5日日曜日

【VB.NET】ADO.NET トランザクション処理

トランザクション処理によりデータベースの更新を完了またはキャンセルします。

トランザクションの実行手順
  1. トランザクションを開始する
  2. SqlCommand.Transactionnにトランザクションを割り当てる。
  3. トランザクションを実行またはキャンセルする。
トランザクションを実行した場合、データベースの更新は完了します。
トランザクションをキャンセルした場合はトランザクションを開始してからキャンセルの直前までのデータベースの更新処理は実行されません。


使用例:Nullを許容しない列にNullを入れ例外を発生させ、例外発生以前のデータベースの更新処理をキャンセルします。

商品マスタのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名商品マスタ物理テーブル名M_ITEM
列定義
No論理名物理名データ型Nullを許容主キー
1商品CDITEM_CDnvarchar(4)NoYes
2商品名ITEM_NMnvarchar(32)No
3単価PRICEnumeric(8,0)No

商品マスタのテーブルデータ


売上データのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名売上データ物理テーブル名T_SALES
列定義
No論理名物理名データ型Nullを許容主キー
1NONOnumeric(8,0)NoYes
2商品CDITEM_CDnvarchar(4)No
3売上数UNIT_SALESnumeric(8,0)No
4売上額SALES_AMOUNTnumeric(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
実行結果:データは変更されていない

0 件のコメント:

コメントを投稿