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