LoginSignup
0
1

More than 1 year has passed since last update.

C#のSQLServerでトランザクションを導入する

Last updated at Posted at 2023-02-01

処理の中にトランザクションを組み込んだので、やり方をメモしていく。

使用環境:
VisualStudio 2017
SQLServer
C#

必要なusing記述

using System.Data.SqlClient;

App.configからDB接続情報を指定する場合こちらも↓

using System.Configuration;

トランザクション処理について

複数の処理をひとかたまりにし、それらの処理がすべて終わるまでは確定を行わないようにする仕組み。(意訳)

BEGIN …トランザクションの始まりの宣言 
COMMIT …トランザクションの終わりの宣言(変更を確定する)
ROLLBACK …トランザクションの終わりの宣言(変更を取り消しする)

これら3つをコードの中に配置していく。
※必ず3つ使う。

C#のSQLServerでトランザクションを導入する

SQL文の実行のためにDBへ接続する。

DB接続情報の記述方法↓
https://qiita.com/suzuki_q/items/e0e061c559b3f3f22a64

//接続文字列を取得
string connStr = ConfigrationManager.ConnectionStrings["sqlsvrconnect"].ConnectionString;

using (var conn = new SqlConnection(connStr))
{
    // データベースの接続開始
    conn.Open();

    using (SqlCommand command = conn.CreateCommand())
    {
        //トランザクションの開始
        command.Transaction = conn.BeginTransaction();

        StringBuilder sb = new StringBuilder();
        sb.AppendLine(@"INSERT INTO example_teble")
        .AppendLine("(")
        .AppendLine("ID,")
        .AppendLine("PASSWORD,")
        .AppendLine("MONEY")
        .AppendLine(")")
        .AppendLine("VALUES")
        .AppendLine("(")
        .AppendLine("@ID,")
        .AppendLine("@PASSWORD,")
        .AppendLine("@MONEY")
        .AppendLine(")");

        //sbをString型に明示的に変換する
        command.CommandText = sb.ToString();

        command.Parameters.Add("@ID", SqlDbType.Int).Value = id;
        command.Parameters.Add("@PASSWORD", SqlDbType.NVarChar).Value = password;
        command.Parameters.Add("@MONEY", SqlDbType.Money).Value = money;
    
        try
        {
            //SQLの実行
            command.ExecuteNonQuery();
        }
        catch(Exception e)
        {
            //変更を取り消しする
            command.Transaction.Rollback();
            return;
        }
    
        //Parameterのクリア
        command.Parameters.Clear();

        //変更を確定する
        command.Transaction.Commit();

    }
    // データベースの接続終了
    conn.Close();
}

他の人の記事に乗っていた
SqlTransaction tran = sqlconn.BeginTransaction();

transaction.Rollback();
transaction.Commit();
などの書き方をすると、

System.InvalidOperationException
コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまだ初期化されていません。

というエラーが発生してしまい、だめでした。

SqlCommand command = conn.CreateCommand()のcommandを使ったところうまく行った。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1