C#を始めよう|MySQLのSQL文を実行

C#でMySQLのSQL文を実行するプログラムを作りました。

MySQLにアクセスするクラス

MySQLの処理をまとめるクラスを作ります。

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;

class MySQLsssproduct
{
    public  bool    CONST_OK                    =   true;
    public  bool    CONST_NG                    =   false;
    public  string  CONST_Server                =   "localhost";
    public  string  CONST_UserId                =   "root";
    public  string  CONST_Password              =   "";
    public  string  CONST_Database              =   "sssproduct";
    public  string  CONST_TblTest               =   "TBLTEST";
    public  string  CONST_TblTestConstitution   =   "TBLTESTID       DECIMAL(5,0) UNSIGNED DEFAULT 0   NOT NULL," +
                                                    "TBLTESTNAMERUBY VARCHAR(20)           DEFAULT ''  NOT NULL," +
                                                    "TBLTESTNAME     VARCHAR(20)           DEFAULT ''  NOT NULL,";
    public  string  CONST_TblTestPrimarykey     =   "TBLTESTID";
}
//  ***********************************************************
//  テーブル(TBLTEST)レイアウト
//  ***********************************************************
class TBLTESTRECORD
{
    public decimal Id;
    public string Ruby;
    public string Name;
}

MySQLを扱うのに必要になるのがMySql.Data.MySqlClientライブラリです。
戻り値やMySQLの接続等で使用する定数を宣言します。
TBLTESTRECORDはテーブルTBLTESTのレコードレイアウトイメージです。

このMySQLsssproductクラスにMySQL関連の処理を追加します。

MySQL接続

    //  ***********************************************************
    //  MySQL(sssproduct)接続
    //  ***********************************************************
    public bool Connect(MySqlConnection Connection)
    {
        try
        {
            Connection.ConnectionString = string.Format("Server={0};Database={1};Uid={2};Pwd={3}",
                                                        CONST_Server, CONST_Database, CONST_UserId, CONST_Password);
            Connection.Open();
        }
        catch (MySqlException e)
        {
            Console.WriteLine("Connect ERROR");
            Console.WriteLine(e.Message);
            return  CONST_NG;
        }
        return CONST_OK;
    }

他のメソッドから呼び出されるのでMySqlConnectionクラスをインスタンス化した Connectionを引数で受け取りMySQLに接続します。

定数を使ってMySQL接続文字列を生成してMySQLに接続します。
ここではカレントデータベースをsssproductにしています。

正常に接続できたら定数CONST_OK、失敗したらCONST_NGを戻り値として返します。

MySQL解放

MySQLの接続して必要な処理が終わったらMySQLを解放する必要があります。

    //  ***********************************************************
    //  MySQL(sssproduct)解放
    //  ***********************************************************
    public void DeConnect(MySqlConnection Connection)
    {
        Connection.Close();
    }

他のメソッドから呼び出されるのでMySqlConnectionクラスをインスタンス化した Connectionを引数で受け取りMySQLを解放します。

テーブル有無確認

    //  ***********************************************************
    //  テーブル有無確認
    //  ***********************************************************
    public bool TableExistenceCheck(string TableName)
    {
        string StrSql = "";
        MySqlConnection Connection = new MySqlConnection();

        //  MySQL sssproduct接続
        if (Connect(Connection) == CONST_NG)
            return CONST_NG;
        //  テーブル有無確認
        try
        {
            //  テーブル有り:CONST_OKを返す
            //  テーブル無し:CONST_NGを返す
            StrSql = StrSql + "SELECT ";
            StrSql = StrSql + "        1 ";
            StrSql = StrSql + "    FROM ";
            StrSql = StrSql + "    " + TableName;
            StrSql = StrSql + "    LIMIT   1";
            MySqlCommand Command = new MySqlCommand();
            Command.CommandText = StrSql;
            Command.Connection = Connection;
            MySqlDataReader Reader = Command.ExecuteReader();
            Reader.Read();
        }
        catch (MySqlException)
        {
            DeConnect(Connection);
            return CONST_NG;
        }
        DeConnect(Connection);
        return CONST_OK;
    }

引数でテーブル名を受け取りそのテーブルが存在するか否かを確認します。

特定のSELECT文を実行して正常に動作すればテーブルが存在するので定数CONST_OK、エラーの場合はテーブルが存在しないのでCONST_NGを戻り値として返します。

MySqlConnectionをインスタンス化して処理の始めと最後に、先ほどのMySQLに接続するメソッドConnect、解放するメソッドDeConnectを呼び出しています。

MySqlCommand

SELECT文等のテーブルの行(レコード)を取得するにはExecuteReaderとReadをセットで使用します。
INSERT文やDELETE文等、テーブルの行取得に無関係な場合はExecuteNonQueryを使うのが基本になります。

テーブル作成

    //  ***********************************************************
    //  テーブル作成
    //  ***********************************************************
    public bool TableCreate(string TableName, string Constitution, string PrimaryKey)
    {
        string StrSql = "";
        MySqlConnection Connection = new MySqlConnection();

        //  MySQL sssproduct接続
        if (Connect(Connection) == CONST_NG)
            return CONST_NG;
        //  テーブル作成
        try
        {
            StrSql = StrSql + "CREATE  TABLE    " + TableName;
            StrSql = StrSql + "(";
            StrSql = StrSql + "    " + Constitution;
            StrSql = StrSql + "    PRIMARY KEY(" + PrimaryKey + ")";
            StrSql = StrSql + ")";
            MySqlCommand Command = new MySqlCommand();
            Command.CommandText = StrSql;
            Command.Connection = Connection;
            Command.ExecuteNonQuery();
        }
        catch (MySqlException e)
        {
            Console.WriteLine("TableCreate ERROR");
            Console.WriteLine(e.Message);
            DeConnect(Connection);
            return CONST_NG;
        }
        DeConnect(Connection);
        return CONST_OK;
    }

引数は作成するテーブル名、列の構成、プライマリキーに設定する列名です。

CREATE文を使ってテーブル作成と同時にプライマリキー設定します。

CREATE文は行(レコード)の取得とは無関係なのでExecuteNonQueryを使用しています。

テーブル削除

    //  ***********************************************************
    //  テーブル削除
    //  ***********************************************************
    public bool TableDelete(string TableName)
    {
        string StrSql = "";
        MySqlConnection Connection = new MySqlConnection();

        //  MySQL sssproduct接続
        if (Connect(Connection) == CONST_NG)
            return CONST_NG;
        //  テーブル削除
        try
        {
            StrSql = StrSql + "DROP    TABLE    " + TableName;
            MySqlCommand Command = new MySqlCommand();
            Command.CommandText = StrSql;
            Command.Connection = Connection;
            Command.ExecuteNonQuery();
        }
        catch (MySqlException e)
        {
            Console.WriteLine("TableDelete ERROR");
            Console.WriteLine(e.Message);
            DeConnect(Connection);
            return CONST_NG;
        }
        DeConnect(Connection);
        return CONST_OK;
    }

引数で削除対象のテーブル名を受け取りDROP文でテーブルを削除します。

行(レコード)追加

    //  ***********************************************************
    //  テーブルTBLTESTレコード追加
    //  ***********************************************************
    public  bool    TblTestInsert(List<TBLTESTRECORD> rec)
    {
        MySqlConnection Connection = new MySqlConnection();

        //  MySQL sssproduct接続
        if (Connect(Connection) == CONST_NG)
            return CONST_NG;
        //  レコード追加
        for (int i = 0; i < rec.Count; i++)
        {
            string StrSql = "";
            StrSql = StrSql + "INSERT  INTO    " + CONST_TblTest;
            StrSql = StrSql + "(";
            StrSql = StrSql + "    TBLTESTID,";
            StrSql = StrSql + "    TBLTESTNAMERUBY,";
            StrSql = StrSql + "    TBLTESTNAME";
            StrSql = StrSql + ")";
            StrSql = StrSql + "VALUES ";
            StrSql = StrSql + "(";
            StrSql = StrSql + "    " + rec[i].Id + ",";
            StrSql = StrSql + "   '" + rec[i].Ruby + "',";
            StrSql = StrSql + "   '" + rec[i].Name + "'";
            StrSql = StrSql + ")";
            try
            {
                MySqlCommand Command = new MySqlCommand();
                Command.CommandText = StrSql;
                Command.Connection = Connection;
                Command.ExecuteNonQuery();
            }
            catch (MySqlException e)
            {
                Console.WriteLine("TblTestInsert ERROR");
                Console.WriteLine(e.Message);
                DeConnect(Connection);
                return CONST_NG;
            }
        }
        DeConnect(Connection);
        return CONST_OK;
    }

TBLTESTRECORDクラスをListクラスとしてインスタンス化した引数を受け取ります。

引数で受け取ったListクラスの行数分INSERT文を使って行(レコード)追加します。

Listクラス

⇩Listクラスについてはこちらを参照下さい。

C#を始めよう|クラスをListクラスとして使う
データの一時保存等に便利なListクラスってものがあるのですが、レコードレイアウト的な他クラスをListクラスにして使ってみた。 ベースのクラス using System; using System.Collections.Gener...

行(レコード)検索

    //  ***********************************************************
    //  テーブルTBLTESTレコード検索
    //  ***********************************************************
    public List<TBLTESTRECORD> TblTestSelect(decimal IdFrom, decimal IdTo)
    {
        string StrSql = "";
        MySqlConnection Connection = new MySqlConnection();
        List<TBLTESTRECORD> Listrec = new List<TBLTESTRECORD>();

        //  MySQL sssproduct接続
        if (Connect(Connection) == CONST_NG)
            return Listrec;
        //  レコード検索
        try
        {
            StrSql = StrSql + "SELECT ";
            StrSql = StrSql + "        TBLTESTID,";
            StrSql = StrSql + "        TBLTESTNAMERUBY,";
            StrSql = StrSql + "        TBLTESTNAME ";
            StrSql = StrSql + "    FROM ";
            StrSql = StrSql + "    " + CONST_TblTest;
            StrSql = StrSql + "    WHERE ";
            StrSql = StrSql + "        TBLTESTID   >=  " + IdFrom   +   " AND ";
            StrSql = StrSql + "        TBLTESTID   <=  " + IdTo;
            MySqlCommand Command = new MySqlCommand();
            Command.CommandText = StrSql;
            Command.Connection = Connection;
            MySqlDataReader Reader = Command.ExecuteReader();
            while ( Reader.Read()   )
            {
                TBLTESTRECORD rec = new TBLTESTRECORD();
                rec.Id = (decimal)Reader.GetValue(0);
                rec.Ruby = (string)Reader.GetValue(1);
                rec.Name = (string)Reader.GetValue(2);
                Listrec.Add(rec);
            }
        }
        catch (MySqlException e)
        {
            Console.WriteLine("TblTestSelect ERROR");
            Console.WriteLine(e.Message);
        }
        DeConnect(Connection);
        return Listrec;
    }

TBLTESTのプライマリーキーであるIDを引数で受け取り行(レコード)を検索します。
行(レコード)と取得はSELECT文を使用します。
検索結果をListクラスを用いて戻り値として返します。

テーブル更新

    //  ***********************************************************
    //  テーブルTBLTESTレコード更新
    //  ***********************************************************
    public bool TblTestUpdate(decimal IdFrom, decimal IdTo, string[] text)
    {
        MySqlConnection Connection = new MySqlConnection();

        //  MySQL sssproduct接続
        if (Connect(Connection) == CONST_NG)
            return CONST_NG;
        //  レコード追加
        try
        {
            string StrSql = "";
            StrSql = StrSql + "UPDATE  "    +   CONST_TblTest;
            if (    text[0].Length != 0 )
                StrSql = StrSql + "    SET TBLTESTNAMERUBY =  '"    +   text[0] +   "'";
            if (    text[1].Length != 0    )
            {
                if (text[0].Length == 0)
                    StrSql = StrSql + "    SET TBLTESTNAME =  '" + text[1]  +   "'";
                else
                    StrSql = StrSql + "    ,   TBLTESTNAME  =  '" + text[1] + "'";
            }
            StrSql = StrSql + "    WHERE ";
            StrSql = StrSql + "        TBLTESTID   >=  " +  IdFrom  +   " AND ";
            StrSql = StrSql + "        TBLTESTID   <=  " +  IdTo;
            MySqlCommand Command = new MySqlCommand();
            Command.CommandText = StrSql;
            Command.Connection = Connection;
            Command.ExecuteNonQuery();
        }
        catch (MySqlException e)
        {
            Console.WriteLine("TblTestUpdate ERROR");
            Console.WriteLine(e.Message);
            DeConnect(Connection);
            return CONST_NG;
        }
        DeConnect(Connection);
        return CONST_OK;
    }

引数のIdFromとIdToはIDで更新対象を絞り込み、又、配列textの0番目はTBLTESTNAMERUBYを更新する内容、 1番目はTBLTESTNAMEを更新する内容です。

テーブルの更新にはUPDATE文を用います。

行(レコード削除)

    //  ***********************************************************
    //  テーブルTBLTESTレコード削除
    //  ***********************************************************
    public bool TblTestDelete(decimal IdFrom, decimal IdTo)
    {
        MySqlConnection Connection = new MySqlConnection();

        //  MySQL sssproduct接続
        if (Connect(Connection) == CONST_NG)
            return CONST_NG;
        //  レコード削除
        try
        {
            string StrSql = "";
            StrSql = StrSql + "DELETE ";
            StrSql = StrSql + "    FROM ";
            StrSql = StrSql + "        "    +   CONST_TblTest;
            StrSql = StrSql + "    WHERE ";
            StrSql = StrSql + "        TBLTESTID   >=  " + IdFrom + " AND ";
            StrSql = StrSql + "        TBLTESTID   <=  " + IdTo;
            MySqlCommand Command = new MySqlCommand();
            Command.CommandText = StrSql;
            Command.Connection = Connection;
            Command.ExecuteNonQuery();
        }
        catch (MySqlException e)
        {
            Console.WriteLine("TblTestDelete ERROR");
            Console.WriteLine(e.Message);
            DeConnect(Connection);
            return CONST_NG;
        }
        DeConnect(Connection);
        return CONST_OK;
    }
}

削除対象範囲のIDを引数で受け取りDELETE文を使用して行(レコード)削除します。

以上でMySQLsssproductクラスは完成とします。

MySQLsssproductを使う

インスタンス化して使用するようになります。

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;

namespace ProjectMySQL
{
    class Program
    {
        static void Main(string[] args)
        
        {
            MySQLsssproduct sssproduct = new MySQLsssproduct();

            //  テーブルTBLTEST有無確認
            if (sssproduct.TableExistenceCheck(sssproduct.CONST_TblTest) == sssproduct.CONST_OK)
                Console.WriteLine(string.Format("テーブル{0}が既に存在します",sssproduct.CONST_TblTest));
        }
    }
}

一例を書いてみました。

コメント