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クラスについてはこちらを参照下さい。

行(レコード)検索
// ***********************************************************
// テーブル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));
}
}
}
一例を書いてみました。
コメント