トランザクション処理

 トランザクション処理を行うにはConnectionクラスとCommandクラスを使います。トランザクション処理は次の手順で行います。

  1. Connectionオブジェクトを生成する
  2. データベースに接続する
  3. ConnectionオブジェクトのBeginTransactionメソッドでTransactionオブジェクトを取得する
  4. Commandオブジェクトを生成する
  5. CommandオブジェクトのTransactionプロパティに取得したTransactionオブジェクトを設定する
  6. SQLコマンドを実行する
  7. 確定(Commit)するか、取り消し(Rollback)をする
  8. データベースを切断する

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 TransactionTest

サンプルダウンロード

○ 作成の準備

 「CommandTest」プロジェクトを修正して作成しましょう。CommandTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。

○ プログラム

 Mainメソッドを次のように記述してください。

Module1.vb

  1. Sub Main()
  2.  '接続文字列
  3.  Dim constr As String = "Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Work\Books.mdf;Integrated Security=True;Connect Timeout=30"
  4.  'SqlConnectionオブジェクトを生成
  5.  Dim con As SqlConnection = New SqlConnection(constr)
  6.  '追加する情報を入力
  7.  Console.WriteLine("登録するユーザー情報を入力してください。")
  8.  Console.Write("ID:")
  9.  Dim id As Integer = Int32.Parse(Console.ReadLine())
  10.  Console.Write("ユーザー名:")
  11.  Dim username As String = Console.ReadLine()
  12.  Console.Write("パスワード:")
  13.  Dim password As String = Console.ReadLine()
  14.  Console.Write("氏名:")
  15.  Dim name As String = Console.ReadLine()
  16.  '入力した情報をもとにSQL文を作成
  17.  Dim sql As String = "INSERT INTO Users VALUES(" & id & ", '" & username & "', '" & password & "', N'" & name & "')"
  18.  'SqlCommandオブジェクトを生成
  19.  Dim cmd As New SqlCommand(sql, con)
  20.  '実行予定のSQL文を表示
  21.  Console.WriteLine("実行するSQL文:{0}", cmd.CommandText)
  22.  'データベースを開く
  23.  con.Open()
  24.  'SqlTransactionオブジェクトを取得
  25.  Dim trans As SqlTransaction = con.BeginTransaction()
  26.  'SqlCommandオブジェクトにSqlTransactionオブジェクトをセット
  27.  cmd.Transaction = trans
  28.  'SQL文を実行する
  29.  Dim ret As Integer = cmd.ExecuteNonQuery()
  30.  '変更のあった行数を表示する
  31.  Console.WriteLine("変更のあった件数:{0}", ret)
  32.  '確定か取消しを入力
  33.  Console.Write("1)確定 2)取消し(デフォルト):")
  34.  Dim input As String = Console.ReadLine()
  35.  Select Case input
  36.   Case "1"
  37.    '確定
  38.    trans.Commit()
  39.    Console.WriteLine("確定しました。")
  40.   Case Else
  41.    '取消し
  42.    trans.Rollback()
  43.    Console.WriteLine("取り消しました。")
  44.  End Select
  45.  'データベースを閉じる
  46.  con.Close()
  47.  Console.ReadLine()
  48. End Sub

○ 実行結果

登録するユーザー情報を入力してください。
ID:5
ユーザー名:itou
パスワード:ipass
氏名:伊藤
実行するSQL文:INSERT INTO Users VALUES(5, 'itou', 'ipass', N'伊藤')
変更のあった件数:1
1)確定 2)取消し(デフォルト):2
取り消しました。

Usersテーブルに追加されていない
Usersテーブルに追加されていない

登録するユーザー情報を入力してください。
ID:5
ユーザー名:itou
パスワード:ipass
氏名:伊藤
実行するSQL文:INSERT INTO Users VALUES(5, 'itou', 'ipass', N'伊藤')
変更のあった件数:1
1)確定 2)取消し(デフォルト):1
確定しました。

Usersテーブルに追加された
Usersテーブルに追加された

○ 解説

 36行目でTransactionオブジェクトを取得しています。ConnectionオブジェクトのOpenメソッドを呼び出した後に取得します。その後、39行目にあるように、CommandオブジェクトのTransactionプロパティに取得したTransactionオブジェクトをセットします。これにより、コマンドを実行するとトランザクションモードで実行され、すぐには確定されなくなります。

 51行目から、確定するか、取り消すかの処理が行われます。もし確定する場合は53行目にあるように、TransactionオブジェクトのCommitメソッドを呼び出して確定します。これによりデータベース上の変更が確定され、データベースに反映されます。取り消す場合は57行目にあるようにTransactionオブジェクトのRollbackメソッドを呼び出して取り消します。これによりデータベース上の変更が破棄され、SQL文実行前の状態に戻ります。確定か、取り消しかを指定した後、62行目にあるようにデータベースを閉じます。

前へ   次へ