【VB.NET】トランザクション処理を行うには?

訪問して頂きありがとうございます。まさふくろーです。

この記事では、トランザクション処理を行う方法をご紹介します。

トランザクション処理を行う

  • トランザクションを使用すると、データベース更新中にエラーが発生した場合、データの整合性を保持することができます。
  • トランザクションを使用する手順は以下になります。

トランザクションの開始

  • OleDbConnectionクラスをインスタンス化します。
  • 書式は、以下になります。

New OleDbConnection()

  • OleDbConnectionのBeginTransactionメソッドで、トランザクションを開始します。
  • BeginTransactionメソッドの戻り値は、OleDbTransaction型です。
  • 書式は、以下になります。

インスタンス化したOleDbConnection.BeginTransaction()

実行するSQLにトランザクションを適用する

  • OleDbCommandクラスをインスタンス化します。
  • 書式は、以下になります。

New OleDbCommand()

  • OleDbCommandのTransactionプロパティで、トランザクションを適用します。
  • 書式は、以下になります。

インスタンス化したOleDbCommand.Transaction = インスタンス化したOleDbConnection.BeginTransaction()

トランザクションを終了する

  • トランザクションを終了するには、OleDbTransactionクラスのCommitまたはRollbackメソッドを実行します。
  • Commitメソッドは、更新した内容をデータベースに反映し、Rollbackメソッドは、更新前の状態に戻します。
  • 書式は、以下になります。

OleDbTransaction.Commit()

OleDbTransaction.Rollback()

  • SQL Serverに接続する場合は、SqlConnectionクラス、SqlCommandクラスでも可能です。
  • トランザクションの開始

    New SqlConnection()

    インスタンス化したSqlConnection.BeginTransaction()

  • 実行するSQLにトランザクションを適用する

    New SqlCommand()

    インスタンス化したSqlCommand.Transaction = インスタンス化したSqlConnection.BeginTransaction()

  • トランザクションを終了する

    SqlTransaction.Commit()

    SqlTransaction.Rollback()

サンプルプログラム

OleDbConnectionクラスを使用する

2 「複数テーブルのレコードを更新」ボタンクリック時に以下処理を行う。
4~9 接続先データベースの情報を、変数に代入。
11 OleDbConnectionクラスのインスタンス化。(Usingステートメントでリソース開放を自動化)
13~18 ConnectionStringプロパティにデータベース情報を設定。
20 データベースに接続。
22 トランザクションを開始し、OleDbTransaction型の変数「oleDbTran」に値を代入。
26 OleDbCommandクラスのインスタンス化。(Usingステートメントでリソース開放を自動化)
28 SQL文を実行するために、13~18行目で設定したデータベース情報と同じ情報をConnection プロパティに設定。
30 実行するSQL文にトランザクションを適用する。
32~39
レコードを更新するSQL文をCommandTextプロパティに設定。
35~39行目の「?」マークは、以下41~44行目で設定するパラメータを使用する際に記述します。
41 「SalesOrderHeader」テーブルの「Status」列に、値「6」を設定する。
42 「SalesOrderHeader」テーブルの「SubTotal」列に、値「1070.694」を設定する。
43 「SalesOrderHeader」テーブルの「ModifiedDate」列に、値「現在日」を設定する。
44 「SalesOrderHeader」テーブルの「SalesOrderID」列に、値「71774」を設定する。
46 SQL文を実行する。
48 41~44行目で設定したパラメータを初期化する。
50~58 レコードを更新するSQL文をCommandTextプロパティに設定。
53~58行目の「?」マークは、以下60~63行目で設定するパラメータを使用する際に記述します。
60 「SalesOrderDetail」テーブルの「OrderQty」列に、値「2」を設定する。
61 「SalesOrderDetail」テーブルの「ModifiedDate」列に、値「現在日」を設定する。
62 「SalesOrderDetail」テーブルの「SalesOrderID」列に、値「71774」を設定する。
63 「SalesOrderDetail」テーブルの「SalesOrderDetailID」列に、値「110562」を設定する。
65 SQL文を実行する。
67 更新処理が正常に終了したら、更新結果をすべてのテーブルに反映する。
71 処理が正常に終了したら、正常終了のメッセージをラベルに表示。
73 処理の実行中にエラーが発生した場合、
75 すべてのテーブルに対して、更新前のデータに戻す。
77 エラー内容を取得し、ラベルに表示する。

SqlConnectionクラスを使用する

2 「複数テーブルのレコードを更新」ボタンクリック時に以下処理を行う。
4~8 接続先データベースの情報を、変数に代入。
10 SqlConnectionクラスのインスタンス化。(Usingステートメントでリソース開放を自動化)
12~16 ConnectionStringプロパティにデータベース情報を設定。
18 データベースに接続。
20 トランザクションを開始し、SqlTransaction型の変数「sqlTran」に値を代入。
24 SqlCommandクラスのインスタンス化。(Usingステートメントでリソース開放を自動化)
26 SQL文を実行するために、12~16行目で設定したデータベース情報と同じ情報をConnection プロパティに設定。
28 実行するSQL文にトランザクションを適用する。
30~37
レコードを更新するSQL文をCommandTextプロパティに設定。
33~37行目の「@」マークは、以下39~42行目で設定するパラメータを使用する際に記述します。
39 「SalesOrderHeader」テーブルの「Status」列に、値「6」を設定する。
40 「SalesOrderHeader」テーブルの「SubTotal」列に、値「1070.694」を設定する。
41 「SalesOrderHeader」テーブルの「ModifiedDate」列に、値「現在日」を設定する。
42 「SalesOrderHeader」テーブルの「SalesOrderID」列に、値「71774」を設定する。
44 SQL文を実行する。
46 39~42行目で設定したパラメータを初期化する。
48~56 レコードを更新するSQL文をCommandTextプロパティに設定。
51~56行目の「@」マークは、以下58~61行目で設定するパラメータを使用する際に記述します。
58 「SalesOrderDetail」テーブルの「OrderQty」列に、値「2」を設定する。
59 「SalesOrderDetail」テーブルの「ModifiedDate」列に、値「現在日」を設定する。
60 「SalesOrderDetail」テーブルの「SalesOrderID」列に、値「71774」を設定する。
61 「SalesOrderDetail」テーブルの「SalesOrderDetailID」列に、値「110562」を設定する。
63 SQL文を実行する。
65 更新処理が正常に終了したら、更新結果をすべてのテーブルに反映する。
69 処理が正常に終了したら、正常終了のメッセージをラベルに表示。
71 処理の実行中にエラーが発生した場合、
73 すべてのテーブルに対して、更新前のデータに戻す。
75 エラー内容を取得し、ラベルに表示する。

関連記事

テーブルにレコードを追加

【VB.NET】テーブルにレコードを追加するには?

テーブルのレコードを更新

【VB.NET】テーブルのレコードを更新するには?

テーブルのレコードを削除

【VB.NET】テーブルのレコードを削除するには?

データベースに接続

【VB.NET】データベースに接続するには?

Usingステートメント

【VB.NET】UsingステートメントでDisposeメソッドの呼び出しを自動化する

構造化例外処理

【VB.NET】構造化例外処理とは?

最後まで読んでいただき、ありがとうございました!

本のまとめ関連記事はこちら