C# mysqlでトランザクションを使用する

  • 作成日 2022.03.18
  • C#
C# mysqlでトランザクションを使用する

C#で、mysqlでトランザクションを使用するサンプルコードを記述してます。Visual Studioは、2022を使用してます。

環境

  • OS windows10 pro 64bit
  • Microsoft Visual Studio Community 2022

パッケージインストール

mysqlに接続するために、まずは「MySql.Data」をインストールします。
※ここでは、コンソールアプリでプロジェクトを作成してます。

ソリューションを右クリックして「NuGetパッケージの管理」をクリックします。

「参照」をクリックして「mysql」と検索して「Mysql.Data」をインストールしておきます。

トランザクションを使用

トランザクションは「MySqlTransaction」を使用すれば実現することができます。

「Program.cs」に、以下のコードを記述します。

using MySql.Data.MySqlClient;
using System;

namespace MysqlApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // 接続文字列
            var connectionString =
               "Server=192.168.100.42;Port=3306;Uid=testuser;Pwd=password;Database=foo";

            // クエリ
            var sql = "UPDATE tbl SET name = @name WHERE id = @id";

            // インスタンスを生成
            using (var connection = new MySqlConnection(connectionString))

            using (var command = new MySqlCommand(sql, connection))
            {
                MySqlTransaction transaction = null;

                try
                {
                    // 接続
                    connection.Open();
                    command.Connection = connection;

                    // トランザクションを開始
                    transaction = connection.BeginTransaction();
  
                    command.CommandText = sql;

                    command.Parameters.AddWithValue("@name", "foo");
                    command.Parameters.AddWithValue("@id", 1);

                    var result = command.ExecuteNonQuery();

                    // 更新されなかった場合
                    if (result != 1)
                    {
                        Console.WriteLine("update ERROR");
                        // ロールバック
                        transaction.Rollback();
                        return;
                    }

                    // コミット
                    transaction.Commit();
                    //クローズ
                    connection.Close();
                }
                catch (MySqlException me)
                {
                    Console.WriteLine("ERROR: " + me.Message);
                    
                    if (transaction != null)
                    {
                        // ロールバック
                        transaction.Rollback();
                    }
                }

                Console.ReadKey();

            }
        }
    }
}

これでエラー発生時は、コミットされずにロールバックされるようになります。