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)); } } }
一例を書いてみました。
コメント