おきらくプログラム -3ページ目

C#でデータレコード追加 MySQL Connector/Net

申し訳ありません…とりあえず謝罪を^^; えと、ブログを定期的に見てくださる方がおられるとは思いもよりませんでした。コメントで更新を催促されるなんて、もっと予想外w
 いや、ほんとに忙しいんです。次の更新までだいぶ期間が開いてしまうだろうなぁーと、思ってた通りになってしまいました。気長にお付き合いくださいませ。

このブログを始めたのは、自分の引っかかった問題と解決策を少しでも紹介したいということでしたので、まだまだ書きたいネタはあるんですが、なにせ忙しい。今はVS.net C#にてクリスタルレポートとか、印刷とかと格闘中です。おいおい紹介するかもしれません。

Connector/Net で データを追加する

久しぶりの更新の前置きはこのくらいにして、さっそくデーターレコード追加の方法とまいりましょう。実際に見てしまうのが一番早いですね。レコード追加の一連の流れをさっそくコードにしてみましょう。前回の続きということで、name が 樋口一葉 で age が 5000 のレコードを追加します。


//サーバーに接続
string
connstr = "userid=root;password=pass;database=test;Host=localhost";
MySqlConnection conn = new MySqlConnection(connstr);
conn.Open();

//レコードを追加するためのSQL文を作成
string Insert_SQL = "insert into testdata1 ( name, age ) value ( '樋口一葉', 5000 )";

//SQL文と接続情報を指定し、MySQLコマンドを作成
MySqlCommand cmd = new MySqlCommand(Insert_SQL, conn);

//戻り値なしでコマンドを実行
cmd.ExecuteNonQuery();


以上であります。ここまで要所だけ取り出せば、説明ほとんどいりませんよね? 実行してみてエラーが出なければ成功ですw(何この逆説) まぁ、結果を確認してみましょう。


insert


はい、この通り。無事にレコードが追加されていました。レコードの追加といってもやっていることはたいして難しくありません。前回と同じようにまず接続。それからSQL文を指定してコマンドを作成し、そのコマンドを実行する、という流れになります。

ちなみにこの流れは、テーブルデータをまとめて取得するSQL文 select 以外の基本的な流れとなります。delete も update も、SQL文を指定したコマンドを作って、 ExecuteNonQuery() で実行です。次に説明するかもしれませんが、ほとんど同じ内容になるでしょう。ついでにExecuteNonQuery() は戻り値を一応持っています。その数値は、insert文、delete文、update文のときは影響を受けた行数となり、それ以外の時は常に -1 だそうです。一応数値なんですが、C#に渡されるときは string型 だったりします。intなどとして扱いたい場合は、きちんと型変換しましょう。


Auto increment の 数値を取得する


さてさて、無事レコードを追加できたわけですが、多くの場合プライマリキーにAuto Incrementを指定していないでしょうか? 自動的に順番に数値を入れてくれるので、IDなどには重宝するでしょう。データを正規化しているとテーブルがいくつかに分けられますので、insertしたばかりのIDを取得したい場面もよくあるはず。では、自動的に割り振られたこの番号を取得することにしましょう。次の一行で取得できます。

int autoinc = int.Parse(MySqlHelper.ExecuteScalar(conn, "select last_insert_id()").ToString());


これで、int型の autoinc にIDが入ります。ちょっと説明しますと、MySqlHelper は、いちいちMySqlCommandを作ることなく、SQL文を実行することができます。使い分けは…いまいちわかりませんが(えw)、結局 MySqlHelper は内部で MySqlCommand を作り出しているようで、やっていることは全く同じになります。つまり、先ほどのinsert文は、 MySqlCommand を作らずに、

string Insert_SQL = "insert into testdata1 ( name, age ) value ( '樋口一葉', 5000 )";
MySqlHelper
.ExecuteNonQuery(conn, Insert_SQL)


としてしまうこともできます。好みで使い分けていいんじゃないでしょうか^^;

それよりも肝心なのは ExecuteScalar() です。先ほど使った ExecuteNonQuery() との違いは、戻り値を持つことです。単一のデータを返すSQL文(たとえばcount文やnow()関数など)は、この ExecuteScalar() を使うことになります。

このAuto Incrementの数値、取得できるのは最後に追加したレコードだけです。念のため…。

Connectorクラスに レコード追加関数を新設

ではでは、このレコード追加機能を、前回までのconnectorMySQLという名前空間の、Connectorというクラスとして分離していたえせクラスに追加しておきましょう。今回は追加部分だけ書いてみました。わかりますよね^^;

//データ追加 Auto Incrementの数値を返す 失敗時は 0
public static int
insert(string insert_sql)
{
MySqlCommand cmd = new MySqlCommand(insert_sql, conn);
try
{
cmd.ExecuteNonQuery();
}
catch (MySqlException ex)
{
MessageBox.Show("データの追加に失敗しました\n" + ex.Message);
return 0;
}
int autoinc = int.Parse(MySqlHelper.ExecuteScalar(conn, "select last_insert_id()").ToString());
return autoinc;
}


まぁ、簡単だと思います。insertに失敗したらゼロを返し、それ以外の時は、自動的に割り振られた Auto increment の数値を返すようにしています。 Auto increment がいらないなら、その部分をカットし、このメゾットの戻り値を bool型 にでもしてしまってください。また、使い方ですが例によって、

using connectorMySQL;


を宣言するか、面倒でもメゾットを呼び出すたびに毎回、connectorMySQL. をつけるかしてください。(または今のプロジェクトの名前空間とこのクラスの名前空間を一致させてしまってください)

この自作クラスを使って、接続し、レコードを追加するとこうなります。

Connector.Connect("root", "pass");
string Insert_SQL = "insert into testdata1 ( name, age ) value ( '夏目漱石', 1000 )";
Connector.insert(Insert_SQL);

これでおわりです。クラス化するとコードが見やすくなりますね。ちなみに接続ですが、既に接続しているなら、接続しなおす必要はありません。下2行だけでデータを追加できるはずです。

おつかれさまでした~。次はupdateとdeleteなんですが、おそらく説明しなくてもわかりますよね。今回作った関数のSQL文の部分を update / delete にするだけです。まぁ、今回作ったメゾットは Auto increment の数値を返しますから、別のメゾットにしておく必要がありますのでご注意を。もはや別個のメゾットにする必要さえないかもしれませんが><

※夏目漱石にしてあるのはわざとです。次回のupdateのためw

データレコード取得 MySQL Connector/Net

また少しブログの更新期間が開いてしまいましたが、さっそく本題に入っていきたいと思います。なんとかMySQLサーバーに接続を果たしたとして、接続しただけでは何の意味もありませんよね。とりあえず今回はデーターを取得してみましょう。

…とその前に、データーを取得するためのデータベースとテーブルがないとお話になりません。とはいっても、通常クライアントソフトでテーブルを加える作業はまずないと思うので、ここはプログラムせずに、どこぞやのMySQLのフロントエンドを使って適当にテーブルを準備してください。個人的に使用しているのは、かねやんMySQLAdmin と MySQL純正ツール?のMySQL Administrator です。コマンドプロンプトで直接でもいいのですが、やはりGUIのほうが設定は楽です。人によりけりでしょうけど。

ただ、この2つのソフト、どちらかにまとめたいんですが、両方使い続けています。まず、かねやんMySQLAdminは日本語で使いやすいのですが若干古いので、残念なことにUTF8文字コードに対応していません。テーブル名やカラム名、ユーザー名などに英語を使っている分には全く問題ないので、テーブルの作成やメンテナンス時にはいろいろとお世話になっています。代わって MySQL Administrator ですが、(私が知らないだけかもしれませんが)うまく日本語化できないので、少しわかりにくかったりします。英語のよく理解できる方は当然こちらのみを使っておられると思います。純正ツールだけあって、一通りのことはこなします。サーバーの監視やチューニングあたりもできるとても優れたツールだと思います。英語が苦手でない方は是非…。と、そんなこんなで、かねやんほどのソフトを作れるようになったらな~と思う今日この頃であります。

さて便宜上、ここで使用する条件をもう一度…。さらに今回はテーブル名も決めておきましょう。かねやんなりMySQL Administrator なりをつかって、環境を次のようにそろえておくと、ここのページの実験も理解もしやすくなると思います。

ユーザー名 = root
パスワード = pass
使用データベース = test
ホスト = localhost
使用テーブル = testdata1 testdata2 …
testdata1カラム = id , name , age


としておきます。ややこしくなければ、自分の環境に合わせて、コードのほうをその都度変えてください。 しかし実験テーブルとはいえ、なんというベタなカラム名…


Connector/Net で テーブル内データレコードを取得


それではさっそく。テーブルデータを取得しに行ってみましょう。とりあえず、更新やデータ追加のことは考えません。更新などはおいおいやりましょう。前回 接続まで行きましたが、ふりだしに戻り、その時のクラスはあとまわしにして、とりあえず接続からデーター取得までを一気に見てみましょう。できるだけ単純に、必要なところだけを取り出すと下記のようになります。

このコードを試す前に、Connector/Netを使うための設定 は済ませておいてください。フォームにはデータを表示するための DataGridView コントロールの dataGridView1 を配置しておいてください。さらにtestデータベース内のtestdata1テーブルに、何か1件だけデータを入れておいてください。(なくても大丈夫ですが、あったほうがデータを取得できたことがはっきりします)

//サーバーに接続
string
connstr = "userid=root;password=pass;database=test;Host=localhost";
MySqlConnection conn = new MySqlConnection(connstr);
conn.Open();

//データを格納するテーブルを作成
DataTable dt = new DataTable();

//SQL文と接続情報を指定し、データアダプタを作成
MySqlDataAdapter da = new MySqlDataAdapter("select * from testdata1", conn);

//データ取得
da.Fill(dt);


//データ表示
dataGridView1.DataSource = dt;



これらのコードをどこか適当なイベント(Form1_Loadあたり)に書き込んでください。結果は…


reader


無事成功です。あ、表示されている名前と年齢は当然適当ですw ありえませんし。


それはさておき、コードの解説はコード内のコメントでわかるかと思います。知識として知ってしまえばまったく難しくありません。コメントを除けば、たったの7行。Connector/Netは何とも便利なクラスです。もしわかりにくければこのブログにコメントでも下さい^^;(実は初コメントいただきまして、けっこう嬉しかったりするのです)


Connectorクラスに データ取得のための関数を追加する


無事成功したでしょうか。さて、前回Connector/Netを扱う部分を、connectorMySQLという名前空間の、Connectorというクラスとして分離してしまいました。接続しかできなかったクラスですが、今度はここにデータ取得のためのメンバ関数を追加しましょう。

using System;
using System.Collections.Generic;
using System.Text;
//Connector/Net使用のため
using MySql.Data.MySqlClient;
//MessageBox使用のため
using System.Windows.Forms;
//DataTable使用のため
using System.Data;

namespace
connectorMySQL
{
class Connector
{
//MySQLへの接続情報
private static MySqlConnection conn;

//MySQLに接続する boolで接続が成功したかどうかを返す
public static bool Connect(string user, string password)
{
string connstr = string.Format("userid={0};password={1};database=test;Host=localhost",
user, password);
conn = new MySqlConnection (connstr);

try
{
conn.Open();
}
catch (MySqlException ex)
{
MessageBox.Show("接続に失敗しました\n" + ex.Message);
return false;
}

MessageBox.Show("接続に成功しました");
return true;
}

//テーブルからデータを取得する
public static bool TableReader(string select_sql, DataTable datatable)
{
MySqlDataAdapter da = new MySqlDataAdapter(select_sql, conn);

try
{
da.Fill(datatable);
}
catch (MySqlException ex)
{
MessageBox.Show("データ取得に失敗しました\n" + ex.Message);
return false;
}

return true;

}
}


これでこの自作クラスでデータの取得ができるようになったはずです。今回つけ足したTableReaderメゾットは引数を2つ取ります。1つ目はSELECT SQL文そのもの、2つ目はデーターを格納するためのDataTableです。MySQLに接続はしませんので、あらかじめこの自作クラスのConnectメゾットで接続設定をする必要があります。データの取得に失敗したときはメッセージが出、falseを返します。前回と同じように、このクラスを使うときは、

using connectorMySQL;


を宣言するか、面倒でもメゾットを呼び出すたびに毎回、connectorMySQL. をつけるかしてください。(または今のプロジェクトの名前空間とこのクラスの名前空間を一致させてしまってください)

この自作クラスを使って、接続とデータ取得をすると、こうなります。

Connector.Connect("root", "pass");
DataTable testtable = new DataTable();
Connector.TableReader("select * from testdata1", testtable);
dataGridView1.DataSource = testtable;


どうでしょうか。だいぶすっきりしたような気がするんですが。ここまで読んでくださった方、おつかれさまでした。次回はデータの追加とでもいきましょうか。ちょっと次の更新まで時間が空きそうですがねぇ。

MySQL Connector/Net を使用して、C#.netからMySQLに接続する

C#.net と Connector/Net の組み合わせで、MySQLクライアントソフトを作る…ということで、前回 は Visual Studio で Connector/Net を使うための下準備までご紹介しました。ちなみに、MySQLサーバーのほうも、きちんと接続できるようにしておいてくださいね。リモート接続の場合は過去のブログ やほかの皆さんのページなどを参考に…。

ただ便宜上、今回からはリモート接続ではなく、Visual Studioを使っている同じマシン内にMySQLをインストールしているものとして話を進めます。もしリモート接続ならば、該当する部分を適当に変えてください。一応、ここから先は…

ユーザー名 = root
パスワード = pass
使用データベース = test
ホスト = localhost


としておきます。

Connector/Net で MySQL に接続


さて、実際にC#.netから接続してみましょう。実際に必要なコードは下の通りです。これだけでMySQLと接続できてしまいます。かんたんでしょ? お好きなイベントの中に以下のコードを組み入れるか、関数にしてしまってもいいと思います。

string connstr = "userid=root;password=pass;database=test;Host=localhost";
MySqlConnection conn = new MySqlConnection(connstr);
conn.Open();


ただし、このままでは接続に成功したかどうか、いまいちわかりません。まぁ接続に失敗したときは、、.NET Framework が自動でエラーを通知するメッセージを出しますので、それが出なかったら成功、エラーメッセージが出たら失敗ということなんですが…あまりスマートではありません。それに、不特定多数の人が使う段階になって、よくわからないエラーメッセージを出したくはありません。そこで、 try & catch ステートメントを使ってみましょう。接続できたかどうかをメッセージボックスで表示するようにします。


Connector/Net をクラスにしてしまう

さらに、せっかくなので、Connector/Netを扱う部分を、connectorMySQLという名前空間の、Connectorというクラスとして分離してしまいましょう。といっても、すべての変数、関数に static をつけてしまうという、えせクラスですが。Connector/Net という、クラスのかたまりをまたクラスにしてしまう…何とも微妙な表現ですが、ほかに表現の方法が思いつかなかったので^^; そのクラス全体のコードが以下のとおりです。

using System;
using System.Collections.Generic;
using System.Text;
//Connector/Net使用のため
using MySql.Data.MySqlClient;
//MessageBox使用のため
using System.Windows.Forms;

namespace connectorMySQL
{
class Connector
{
//MySQLへの接続情報
private static MySqlConnection conn;

//MySQLに接続する boolで接続が成功したかどうかを返す
public static bool Connect(string user, string password)
{
string connstr = string.Format("userid={0};password={1};database=test;Host=localhost",
user, password);
conn = new MySqlConnection(connstr);


try
{
conn.Open();
}
catch (MySqlException ex)
{
MessageBox.Show("接続に失敗しました\n" + ex.Message);
return false;
}


MessageBox.Show("接続に成功しました");
return true;
}
}
}


これでエセクラスが完成です。このクラスのメゾット(関数)を使うときは、最初の部分で

using connectorMySQL;


を宣言するか、面倒でもメゾットを呼び出すたびに毎回、connectorMySQL. をつけるかしてください。ちなみに、usingで宣言したとして、上記クラスのメゾットを使用し、MySQLに接続するには、

Connector.Connect("root", "pass");

と、これだけです。接続できたかどうかをメッセージボックスで表示し、さらに呼び出し元にtrue か falseを返します。(MySqlException ex)は、Connector/Netが返す、エラーメッセージです。メッセージ内容は英語ですが、「パスワードが違うよ」とか、「ホストみつからねぇ」などのエラー理由をメッセージボックスで表示してくれるはずです。

さて、一気に勢いでクラスまで作ってしまいましたね。次回からはこのクラスに機能をつけ足していき、データーにアクセスしていきましょう。