トランザクション処理
トランザクション処理を行うにはConnectionクラスとCommandクラスを使います。トランザクション処理は次の手順で行います。
- Connectionオブジェクトを生成する
- データベースに接続する
- ConnectionオブジェクトのBeginTransactionメソッドでTransactionオブジェクトを取得する
- Commandオブジェクトを生成する
- CommandオブジェクトのTransactionプロパティに取得したTransactionオブジェクトを設定する
- SQLコマンドを実行する
- 確定(Commit)するか、取り消し(Rollback)をする
- データベースを切断する
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 |
コンソール アプリケーション |
プロジェクト名 |
TransactionTest |
サンプルダウンロード
○ 作成の準備
「CommandTest」プロジェクトを修正して作成しましょう。CommandTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。
○ プログラム
Mainメソッドを次のように記述してください。
Module1.vb
- Sub Main()
- '接続文字列
- Dim constr As String = "Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Work\Books.mdf;Integrated Security=True;Connect Timeout=30"
- 'SqlConnectionオブジェクトを生成
- Dim con As SqlConnection = New SqlConnection(constr)
- '追加する情報を入力
- Console.WriteLine("登録するユーザー情報を入力してください。")
- Console.Write("ID:")
- Dim id As Integer = Int32.Parse(Console.ReadLine())
- Console.Write("ユーザー名:")
- Dim username As String = Console.ReadLine()
- Console.Write("パスワード:")
- Dim password As String = Console.ReadLine()
- Console.Write("氏名:")
- Dim name As String = Console.ReadLine()
- '入力した情報をもとにSQL文を作成
- Dim sql As String = "INSERT INTO Users VALUES(" & id & ", '" & username & "', '" & password & "', N'" & name & "')"
- 'SqlCommandオブジェクトを生成
- Dim cmd As New SqlCommand(sql, con)
- '実行予定のSQL文を表示
- Console.WriteLine("実行するSQL文:{0}", cmd.CommandText)
- 'データベースを開く
- con.Open()
- 'SqlTransactionオブジェクトを取得
- Dim trans As SqlTransaction = con.BeginTransaction()
- 'SqlCommandオブジェクトにSqlTransactionオブジェクトをセット
- cmd.Transaction = trans
- 'SQL文を実行する
- Dim ret As Integer = cmd.ExecuteNonQuery()
- '変更のあった行数を表示する
- Console.WriteLine("変更のあった件数:{0}", ret)
- '確定か取消しを入力
- Console.Write("1)確定 2)取消し(デフォルト):")
- Dim input As String = Console.ReadLine()
- Select Case input
- Case "1"
- '確定
- trans.Commit()
- Console.WriteLine("確定しました。")
- Case Else
- '取消し
- trans.Rollback()
- Console.WriteLine("取り消しました。")
- End Select
- 'データベースを閉じる
- con.Close()
- Console.ReadLine()
- End Sub
○ 実行結果
登録するユーザー情報を入力してください。
ID:5
ユーザー名:itou
パスワード:ipass
氏名:伊藤
実行するSQL文:INSERT INTO Users VALUES(5, 'itou', 'ipass', N'伊藤')
変更のあった件数:1
1)確定 2)取消し(デフォルト):2
取り消しました。
Usersテーブルに追加されていない
登録するユーザー情報を入力してください。
ID:5
ユーザー名:itou
パスワード:ipass
氏名:伊藤
実行するSQL文:INSERT INTO Users VALUES(5, 'itou', 'ipass', N'伊藤')
変更のあった件数:1
1)確定 2)取消し(デフォルト):1
確定しました。
Usersテーブルに追加された
○ 解説
36行目でTransactionオブジェクトを取得しています。ConnectionオブジェクトのOpenメソッドを呼び出した後に取得します。その後、39行目にあるように、CommandオブジェクトのTransactionプロパティに取得したTransactionオブジェクトをセットします。これにより、コマンドを実行するとトランザクションモードで実行され、すぐには確定されなくなります。
51行目から、確定するか、取り消すかの処理が行われます。もし確定する場合は53行目にあるように、TransactionオブジェクトのCommitメソッドを呼び出して確定します。これによりデータベース上の変更が確定され、データベースに反映されます。取り消す場合は57行目にあるようにTransactionオブジェクトのRollbackメソッドを呼び出して取り消します。これによりデータベース上の変更が破棄され、SQL文実行前の状態に戻ります。確定か、取り消しかを指定した後、62行目にあるようにデータベースを閉じます。
前へ 次へ