トランザクション処理

 トランザクション処理を行うには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メソッドを次のように記述してください。

Program.cs

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

○ 実行結果

登録するユーザー情報を入力してください。
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テーブルに追加された

○ 解説

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

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

前へ   次へ