C#でデータレコード追加 MySQL Connector/Net
申し訳ありません…とりあえず謝罪を^^; えと、ブログを定期的に見てくださる方がおられるとは思いもよりませんでした。コメントで更新を催促されるなんて、もっと予想外w
いや、ほんとに忙しいんです。次の更新までだいぶ期間が開いてしまうだろうなぁーと、思ってた通りになってしまいました。気長にお付き合いくださいませ。
このブログを始めたのは、自分の引っかかった問題と解決策を少しでも紹介したいということでしたので、まだまだ書きたいネタはあるんですが、なにせ忙しい。今はVS.net C#にてクリスタルレポートとか、印刷とかと格闘中です。おいおい紹介するかもしれません。
Connector/Net で データを追加する |
久しぶりの更新の前置きはこのくらいにして、さっそくデーターレコード追加の方法とまいりましょう。実際に見てしまうのが一番早いですね。レコード追加の一連の流れをさっそくコードにしてみましょう。前回の続きということで、name が 樋口一葉 で age が 5000 のレコードを追加します。
//サーバーに接続 |
以上であります。ここまで要所だけ取り出せば、説明ほとんどいりませんよね? 実行してみてエラーが出なければ成功ですw(何この逆説) まぁ、結果を確認してみましょう。
はい、この通り。無事にレコードが追加されていました。レコードの追加といってもやっていることはたいして難しくありません。前回と同じようにまず接続。それから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 )"; |
としてしまうこともできます。好みで使い分けていいんじゃないでしょうか^^;
それよりも肝心なのは ExecuteScalar() です。先ほど使った ExecuteNonQuery() との違いは、戻り値を持つことです。単一のデータを返すSQL文(たとえばcount文やnow()関数など)は、この ExecuteScalar() を使うことになります。
このAuto Incrementの数値、取得できるのは最後に追加したレコードだけです。念のため…。
Connectorクラスに レコード追加関数を新設 |
ではでは、このレコード追加機能を、前回までのconnectorMySQLという名前空間の、Connectorというクラスとして分離していたえせクラスに追加しておきましょう。今回は追加部分だけ書いてみました。わかりますよね^^;
//データ追加 Auto Incrementの数値を返す 失敗時は 0 |
まぁ、簡単だと思います。insertに失敗したらゼロを返し、それ以外の時は、自動的に割り振られた Auto increment の数値を返すようにしています。 Auto increment がいらないなら、その部分をカットし、このメゾットの戻り値を bool型 にでもしてしまってください。また、使い方ですが例によって、
using connectorMySQL; |
を宣言するか、面倒でもメゾットを呼び出すたびに毎回、connectorMySQL. をつけるかしてください。(または今のプロジェクトの名前空間とこのクラスの名前空間を一致させてしまってください)
この自作クラスを使って、接続し、レコードを追加するとこうなります。
Connector.Connect("root", "pass"); |
おつかれさまでした~。次は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 |
としておきます。ややこしくなければ、自分の環境に合わせて、コードのほうをその都度変えてください。 しかし実験テーブルとはいえ、なんというベタなカラム名…
Connector/Net で テーブル内データレコードを取得 |
それではさっそく。テーブルデータを取得しに行ってみましょう。とりあえず、更新やデータ追加のことは考えません。更新などはおいおいやりましょう。前回
接続まで行きましたが、ふりだしに戻り、その時のクラスはあとまわしにして、とりあえず接続からデーター取得までを一気に見てみましょう。できるだけ単純に、必要なところだけを取り出すと下記のようになります。
このコードを試す前に、Connector/Netを使うための設定
は済ませておいてください。フォームにはデータを表示するための DataGridView コントロールの dataGridView1 を配置しておいてください。さらにtestデータベース内のtestdata1テーブルに、何か1件だけデータを入れておいてください。(なくても大丈夫ですが、あったほうがデータを取得できたことがはっきりします)
//サーバーに接続 //データ表示 |
これらのコードをどこか適当なイベント(Form1_Loadあたり)に書き込んでください。結果は…
無事成功です。あ、表示されている名前と年齢は当然適当ですw ありえませんし。
それはさておき、コードの解説はコード内のコメントでわかるかと思います。知識として知ってしまえばまったく難しくありません。コメントを除けば、たったの7行。Connector/Netは何とも便利なクラスです。もしわかりにくければこのブログにコメントでも下さい^^;(実は初コメントいただきまして、けっこう嬉しかったりするのです)
Connectorクラスに データ取得のための関数を追加する |
無事成功したでしょうか。さて、前回Connector/Netを扱う部分を、connectorMySQLという名前空間の、Connectorというクラスとして分離してしまいました。接続しかできなかったクラスですが、今度はここにデータ取得のためのメンバ関数を追加しましょう。
using System; try MessageBox.Show("接続に成功しました"); try return true; |
これでこの自作クラスでデータの取得ができるようになったはずです。今回つけ足したTableReaderメゾットは引数を2つ取ります。1つ目はSELECT SQL文そのもの、2つ目はデーターを格納するためのDataTableです。MySQLに接続はしませんので、あらかじめこの自作クラスのConnectメゾットで接続設定をする必要があります。データの取得に失敗したときはメッセージが出、falseを返します。前回と同じように、このクラスを使うときは、
using connectorMySQL; |
を宣言するか、面倒でもメゾットを呼び出すたびに毎回、connectorMySQL. をつけるかしてください。(または今のプロジェクトの名前空間とこのクラスの名前空間を一致させてしまってください)
この自作クラスを使って、接続とデータ取得をすると、こうなります。
Connector.Connect("root", "pass"); |
どうでしょうか。だいぶすっきりしたような気がするんですが。ここまで読んでくださった方、おつかれさまでした。次回はデータの追加とでもいきましょうか。ちょっと次の更新まで時間が空きそうですがねぇ。
MySQL Connector/Net を使用して、C#.netからMySQLに接続する
C#.net と Connector/Net の組み合わせで、MySQLクライアントソフトを作る…ということで、前回
は Visual Studio で Connector/Net を使うための下準備までご紹介しました。ちなみに、MySQLサーバーのほうも、きちんと接続できるようにしておいてくださいね。リモート接続の場合は過去のブログ
やほかの皆さんのページなどを参考に…。
ただ便宜上、今回からはリモート接続ではなく、Visual Studioを使っている同じマシン内にMySQLをインストールしているものとして話を進めます。もしリモート接続ならば、該当する部分を適当に変えてください。一応、ここから先は…
ユーザー名 = root |
としておきます。
Connector/Net で MySQL に接続 |
さて、実際にC#.netから接続してみましょう。実際に必要なコードは下の通りです。これだけでMySQLと接続できてしまいます。かんたんでしょ? お好きなイベントの中に以下のコードを組み入れるか、関数にしてしまってもいいと思います。
string connstr = "userid=root;password=pass;database=test;Host=localhost"; |
ただし、このままでは接続に成功したかどうか、いまいちわかりません。まぁ接続に失敗したときは、、.NET Framework が自動でエラーを通知するメッセージを出しますので、それが出なかったら成功、エラーメッセージが出たら失敗ということなんですが…あまりスマートではありません。それに、不特定多数の人が使う段階になって、よくわからないエラーメッセージを出したくはありません。そこで、 try & catch ステートメントを使ってみましょう。接続できたかどうかをメッセージボックスで表示するようにします。
Connector/Net をクラスにしてしまう |
さらに、せっかくなので、Connector/Netを扱う部分を、connectorMySQLという名前空間の、Connectorというクラスとして分離してしまいましょう。といっても、すべての変数、関数に static をつけてしまうという、えせクラスですが。Connector/Net という、クラスのかたまりをまたクラスにしてしまう…何とも微妙な表現ですが、ほかに表現の方法が思いつかなかったので^^; そのクラス全体のコードが以下のとおりです。
using System; namespace connectorMySQL try MessageBox.Show("接続に成功しました"); |
これでエセクラスが完成です。このクラスのメゾット(関数)を使うときは、最初の部分で
using connectorMySQL; |
を宣言するか、面倒でもメゾットを呼び出すたびに毎回、connectorMySQL. をつけるかしてください。ちなみに、usingで宣言したとして、上記クラスのメゾットを使用し、MySQLに接続するには、
Connector.Connect("root", "pass"); |
さて、一気に勢いでクラスまで作ってしまいましたね。次回からはこのクラスに機能をつけ足していき、データーにアクセスしていきましょう。