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

C#.net & MySQL Connector/Net を使用する - 準備

さて、今回からはMySQLを使うクライアント側のソフトを「C#.net」で扱っていくことに話を進めていきましょう。もともとの目的は、いま自分の勤めている会社 で使っているExcelでのデータ管理を、MySQLでデータベース化してまとめて扱おうというものですから、やっと本題に入れるわけです。

まず、MySQLに接続する方法がなくてはなりません。SQL Serverならばマイクロソフトの製品なので、結構簡単にデータベースにつながるのですが、さすがにMySQLは標準ではつながりません。いろいろ調べた結果、おもに2通りの接続方法があることがわかりました。


1.ODBCドライバ & ODBC.netプロバイダ を利用する
2.MySQL Connector/Net を利用する

まず、ODBCドライバを使う方法について。多くのデータベースソフトが対応しているODBCを、MySQLとC#という組み合わせでも使用することができます。ODBCを挟むと、Accessをフロントエンドに使うこともできますし、そのほかの多くのデータベース関連ソフトがODBCをはさんで管理できるようになっています。しかしながらこの方法、サーバー側にではなく、すべてのクライアントマシンにODBCドライバをインストールしなければなりません。ちょっとめんどくさい^^; ついでに、次にあげる Connector/Net よりパフォーマンスが落ちるらしいです。確かめたわけではありませんが、ネット上で検索するとそういう情報がちらほらと。一度テストしてみたいんですが、まぁ、余裕があればということで。今のところその余裕はありませんです。そんなこんなで…

結局2つ目の MySQL Connector/Net を使う方法に落ち着くのであります。ここからはConnector/Netを使っていろいろやってみましょう。ODBCと比べての利点は、作ったクライアントソフトと一緒にDLLさえコピーすれば、クライアントマシンに面倒な設定がいらないこと、そしてパフォーマンスが優れていることでしょう。ODBCの紹介で言っていることの逆を繰り返しただけですw


Connector/Netをインストール


なにはともあれ、ダウンロードしてインストールです。こちら からダウンロードできます。最新のGA版(2008/9/17現在、バージョンは5.23です)を選んでクリックし、その先のページで Windows Binaries (ZIP) をダウンロードしましょう。ダウンロードしたzipファイルを解凍すると、「MySql.Data.msi」というファイルが現れます。もし、過去にConnector/Netをインストールしたことがあるなら、確実にアンインストールしておいてください。それからダブルクリックして、適当にNextなんかをクリックしていきましょう。途中選択肢が現れるところがありますが、そこは普通の[typical](典型的なという意味)を選んでください。解説する必要があったんだろうか…。いじょ!

Connector/Netを使ってみる


無事インストールできたと思います。では、実際にVisual Studio を立ち上げ、C#.netで使ってみましょう。使うために必要な作業は、プロジェクトにConnector/Netの参照を加えること、そしてネームスペースの宣言をすることです。

まずプロジェクトにConnector/Netの参照を加えてみましょう。ソリューションエクスプローラがどこかに表示されていると思います。表示されていなければメニューの[表示]の中に[ソリューション エクスプローラ]というものがありますので、それを表示させてください。表示されたソリューションエクスプローラの中に、参照設定という項目がありますので、そこを選択して右クリックします。


net1-1

出てきた右クリックメニューから[参照の追加]を選ぶと、次のような画面が出ます。(またはメインメニューの[プロジェクト]から[参照の追加]でも同じことができます。)


net1-2

ここで[.NET]タブを選び、「MySQL.Data」を選んでOKを押しましょう。これで参照設定が完了しました。ソリューションエクスプローラに目を戻してみましょう。参照設定の中に、[MySQL.Data]が追加されていることを確認してください。


net1-3


これで参照の設定は終わりました。お次はネームスペースです。

ネームスペースの設定は必ず必要なことではありませんが、現実的にみてやっておいたほうがいいでしょう。ネームスペースについて詳しい説明はしませんが、いろいろと省略できるようになります^^; Connector/Netの機能を使う(フォームを含む)クラスにコードを書いていく前に、コードの先頭部分に一行を加えます。普通、フォームの場合はコードの先頭に、

using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


と並んでいますので、そのすぐ下に、

using MySql.Data.MySqlClient;


を加えて下さい。これでConnector/Netを使えるようになったはずです。今回はここまで。次は実際にMySQLに接続していきましょう。

MySQLに他のパソコンからリモート接続できない!

え~忙しくてだいぶ時間が空いてしまいましたね。おいそれと続きを書いてみますです。

前回までで、なんとかtelnetが使えるようになりました。さて、今度こそMySQLにリモート接続です。ここに至るまでそれなりに時間がかかりましたが、ここから先も時間がとられてしまいました。すんなりとはいかないものですね。今思えば単純な問題ばかりなんですが・・・。さて今回は直面した問題点を先にすべてあげてしまいましょう。


1.ポート(一般には3306)が開いていない
2.MySQLのユーザー権限設定が変更されていない
3.my.ini になぜか bind-addressが設定されている

他にも色々原因はあると思いますが、ローカル接続(MySQLがインストールされたマシン内だけでの接続)では正常に動くのに、外のパソコンから、ネットワーク上のほかのパソコンからリモート接続できないっていう場合は、一応確認してみて下さい。


1.ポート(一般には3306)が開いていない


まず、大前提、基本中の基本かもしれませんが、ポートが開いていないというものです。解決策は簡単、サーバー側のポートを開けてしまいましょう。前回のTelnet の時と同じです。詳しい手順は前回を見てください。(説明手抜きw) Windowsファイアーウォールでブロックされている場合の手順だけ簡単に説明すると、[コントロールパネル]→[Windowsファイアーウォール]と進み、[例外]タブをクリックし、[ポートの追加]をクリックします。そこでポート番号を「3306」に、また「TCP」のほうにチェックを入れ、OKを押します。せっかくだから画像も張っておきましょう。
mysql port 3306

あ、名前ですが、自分が後で何のために空けたポートかわかれば何でもいいようです。MySQLとでも入れておいてください。


2.MySQLのユーザー権限設定が変更されていない


次も初歩的な問題ですが、知らないとわかりません。これを解決するのに私は何時間も迷いました…。ユーザー権限の問題です。データベースのデータに関してアクセス制限できるのは知っていましたが、ログインに関しても細かく指定できるとは知りませんでした。

初期設定では、rootはローカルホストからしか接続できないようになっています。つまり、ほかのマシンからrootでログインしようと思っても、接続できないようにブロックされます。まぁ、最初から必ずあるrootには初期段階でパスワードが設定されていないわけですから、これくらの制限はないと、とんでもないことになりそうですが。

この際、同じネットワークからならリモートで何でもできる新しいスーパーユーザーを登録してみましょう。ただしこれには多少の危険が伴います。もし悪意ある人が接続できてしまった場合、MySQL内のデータを盗み放題、破壊し放題なわけです。一応同じネットワーク内に限定するので、そう簡単にインターネットからアクセスされていたずらされるということはないと思いますが。また、ここではわかりやすいように、ユーザー名を[admin]パスワードを[pass]としますが、実際にやる場合は、特に運用前には、念のため、ユーザー名とパスワードはできるだけ推測しにくい ものにしてください。

ではさっそく新しいユーザーを登録してみましょう。adiminというユーザーをpassというパスワードで、同じローカルネットワークからしかつながらないが、何でもできる、という条件で登録します。もう一つ条件として、MySQLサーバーのローカルネットワークのIPアドレスが、192.168.0.なんとか…としましょう。つまり、このローカルネットワークのアドレスの範囲が192.168.0.1~192.168.0.254で、この間にあるIPからしかアクセスできなくする、という設定です。MySQLにrootでログインし、次のように打ち込んでみてください。

grant all on *.* to admin@"192.168.0.%" identified by 'pass' with grant option;

すこしだけgrantコマンドを説明します。

grantのすぐ後の all は、許可する操作を表しています。もし検索だけを許可して、そのほかの操作すべて(データの消去も挿入も項目の追加も…)を許さない場合は、allの部分がselectになります。ここでは、すべてを許可したいので、[all]としています。

つぎの *.* ですが、これは権限を与えるテーブル名とデーターベース名です。*はワイルドカードで、何でも全部、を意味するということになります。そして、ピリオドの前に指定するのはデーターベース名、後ろはテーブル名です。つまり *.* は「すべてのデーターベース」の「すべてのテーブル」に指定した権限を与えるということになります。逆に今回与える権限の範囲を、testというデーターベースのすべてのテーブルに指定したいときは、 *.* の部分が、 test.* となります。

そして、今回のメインとなる部分、to admin@"192.168.0.%" ですが、ここで、ユーザー名と許可ホストを指定することになります。 to [ユーザー名]@[ホスト名] と並べます。この例ではadminというユーザー名で、ローカルネットワークからのみの接続を許可していることになります。"192.168.0.%"の部分ですが、このアドレスはそれぞれの環境に合わせて調整してください。サーバーのIPアドレスがもし192.168.11.1であるなら、調整して"192.168.11.%"としてください。おわかりのように%は*と同じでワイルドカードです。ですから、このユーザーに対して、192.168.0.2からでも、192.168.11.2からでもログインを許可するなら"192.168.%"、ローカルホストからの接続のみを許可したければ、"localhost"とします。逆に、もうどこからでも接続を許すのであれば、単に"%"としてください。

次はパスワードです。identified by 'pass' で設定しています。パスワードなしでユーザー登録するときは、この部分はいりません。省略してください。絶対にお勧めしませんが…。設定の仕方は見たまんまで、identified by '[パスワード]'  となります。

最後に with grant option をつけています。このオプションを指定すると、データーベースやテーブルに対する自分の持つ権限をほかのユーザーに与えることができるようになります。これを省略すると、ほかのユーザーに対する権限の制御ができなくなってしまいます。今回はrootと同じように、何でもできるユーザーを作りたいわけですから、このオプションは必ず記述してください。

これでリモート接続ができるようになったでしょうか?あ、rootで接続しようとしないで下さいねw 今回作った新しいユーザーでしか、リモート接続できません。もちろん、rootでリモートログインできるようにも設定できますが、ユーザー名が必ずあるrootで、初期パスワードが設定されていないかもしれない状態でリモート許可するのは、ちょっとお勧めできませんので^^;それはまたgoogleなどで調べてみてください。まぁ、GUIツールがあれば、そっちでやってしまうのが一番早いです( ̄_ ̄ i)

これでも接続できない場合は…


3.my.ini になぜか bind-addressが設定されている

かもしれません。たとえばmy.iniの[mysqld]に


bind-address = 127.0.0.1


なんて記述があると、 ローカルホストからしか接続できません。この、bind-addressの項目は、MySQLに接続できるサーバー側のIPアドレスを限定するもののようです。クライアント側IPではありません。もしこの項目があり、127.0.0.1と記述されているならば、その行の先頭に # を打ち込んでコメントアウトするか、この項目の行を丸ごと消してしまいましょう。

少し説明を加えると、LANカードを2枚差しているとか、有線LANと無線LANを同時に使用しているとかなどで、MySQLのサーバーマシンに2つ以上のLAN接続があり、2つ以上のIPアドレスを持っている場合、このbind-addressの項目で接続を許可するIPアドレスを限定できます。たとえば、有線LANカードでのIPアドレスが192.168.11.1で、無線LANカードのIPアドレスが192.168.12.1だったとします。この環境の中で bind-address = 192.168.11.1 という項目があると、無線LANを通しての接続は一切受け付けなくなります。上手に使えば、セキュリティーを高められるということです。

で、上で例に挙げた bind-address = 127.0.0.1 の場合ですが、この、「127.0.0.1」は特別なIPアドレスで、 localhost を表すIPなわけです。つまり自分自身のパソコンを表すということです。なので、 bind-address = 127.0.0.1 という一文があると、自分自身から自分自身への接続以外は受け付けない、ということになります。また、ややこしいことに bind-address = 127.0.0.1 の指定がある場合、自分自身のIPアドレスが192.168.11.1であっても、MySQLのホスト名に192.168.11.1と指定すると、接続できなくなってしまいます。あくまでlocalhostまたは127.0.0.1とする必要があります。bind-addressの役割がなんとなくわかっていただけたでしょうか。

さて、これでリモートからも接続できるようになっていると思います。ローカル接続できるのにリモート接続できない場合のいくつかの原因を列挙してみました。これでだめなら私にはお手上げです。ネットワーク自体を疑ってみるか、はたまたMySQLのもっと細かい設定ミスを疑うか…いずれにしても、そう簡単に解決できないと思います><頑張ってください。接続できた場合は、お疲れ様でした^^;

MySQL …の前に Windows Vista + XP でTelnetを使う方法

またもや初歩的な話です。基本を知らずに行き当たりばったりなことをしていると、あとになって突然問題が出てくるものです>< さて、今回の初歩的な話とは、MySQLにリモートから接続できない!というもの…。localhostからは、難なくMySQLにログインできたのですが、別マシンからリモート接続となると、かなり長い道のりが待っていたのでした。では、さっそく、確認作業とまいりましょう。まずは、telnetを使えなくてはなりません。もちろん、クライアントソフトから直接つながるなら、telnetは全く必要ないんですが、基本なので一応ねぇw。 しかし、telnetを使うこと、これがまたWindowsでは結構一苦労。

…と、話を始める前に、一応私の実験環境をば。Tritonn(MySQL)をインストールしたマシンは、Windows XP Professional で、クライアントマシンに使っているのは、Windows Vista Home Premium です。基本的にこの構成ですが、Tritonn(MySQL)をVista Home Premiumにもインストールしていますので、XPをクライアントに使うという、逆の構成も時々実験します。またXPのIPアドレスは 192.168.11.2 です。11.1がルーターで、その次の番号で固定、ということになります。

さて、話がずれましたが、さっそくtelnetを使って、XPにインストールされたMySQLを使ってみましょう。コマンドプロンプトを立ち上げて、


telnet 192.168.11.2


と打ち込んでみました。帰ってきたのは

'telnet'は、内部コマンド外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。

いきなり、あちゃーですね。前にLinuxにMySQLをインストールし、XPのマシンから接続したときは、いとも簡単にtelnet接続できたので、こうなるとは思ってもみませんでした。さて、このようにつながらない原因は調べてみると3つあることがわかりました。


1.Windws Vista では、telnetのクライアントが機能していない
2.Windows XPではtelnetのサーバー機能が立ち上がっていない
3.Windowsファイアーウォールで、23番ポートが閉じている


笑わないでください…。初めてってこんなものです。ともかくLinux(Cent OS)を使ってみたときには、こんな設定は一切意識せずにつながったんですから。まぁ、そのままLinuxをつかっていたら、それはそれで問題のような気もしますが。

まず1つ目の問題です。Windows XPまでは、標準でtelnetクライアントがインストールされていたのですが、Vistaからは、自分でインストールしないといけないようなのです。使ってみて初めてわかる事実です。これをまず解決しましょう。クラシック表示で、[コントロールパネル]→[プログラムと機能]→[Windowsの機能の有効化または無効化]と進んでください。すると次のような画面が出るはずです。


telnet1


この一覧から、Telnetクライアント、という項目を見つけ、チェックボックスにチェックを入れ、OKを押してください。これがまた意外と結構待たされます(数分かかると表示が出ていますが、ほんとに数分かかります。フリーズしたのかと思ったくらいプログレスバーもしばらく動きませんw)が、インストールを自動でやってくれるはずです。

さて、これで1番目の問題は解決しました。お次は2番目の問題、つまりWindows XPでは、telnetサーバーはデフォルトでインストールされているものの、起動していないというものです。(Vistaではインストールもされていないようです。VistaでTelnet接続を受け入れるには、上の画像でTelnetクライアントにチェックを入れましたが、そのすぐ下にTelnetサーバーというものもありますので、これにチェックを入れ、OKを押し、インストールします。)これもコントロールパネルから解決できます。[コントロールパネル]→[管理ツール]→[サービス]と進んでください。Telnetという名前のものがあるはずです。そのTelnetのところをダブルクリックしましょう。


telnet3


スタートアップの種類が無効になってますね。これを「手動」または「自動」に切り替えてOKを押します。「手動」なら、またこの画面にきて、「サービスの開始」を押すまで始まりません。(もしくは、コマンドで開始することもできます。)「自動」にすると、Windowsを立ち上げた時点で、telnetサービスが起動することになります。


telnet4


なお自動に切り替えても、その時点で開始されるわけではなく、Windowsが立ち上がった時に自動で開始されるわけですから、すぐにサービスを使いたいときは、最初だけ、「サービスの開始」を押しておきましょう。

さいごに3番目の調整です。ポートを開けなければなりません。これをせずに接続しようとすると、


接続中: 192.168.11.2...ホストへ接続できませんでした。 ポート番号 23: 接続に失敗しました


と、こうなります。自動でファイアーウォールが設定されているWindowsの場合、けっこうこのファイアーウォールが盲点だったりします。基本なのですが、忘れがちだったりして。私だけ? ともかく、これをなんとかしましょう。サーバーマシン側の23番ポートを開かなくてはなりません。[コントロールパネル]→[Windowsファイアーウォール]と進みます。[例外]タブをクリックし、[ポートの追加]をクリックします。名前はわかりやすく適当に、ポート番号は「23」を打ち込みます。プロトコルはTCPでOKです。自宅や会社のネットワークのみでtelnetを使うなら、[スコープの変更]もしておきましょう。


telnet6

これでだいたいの環境でtelnetが使えると思われます。さっそく最初と同じようにコマンドを打ち込んでみましょう。すると、


Welcome to Microsoft Telnet Service
login:


こうなりますので、サーバー側のマシンで登録されているユーザー(クライアントつまり、リモート接続しようとしている手元のマシンのユーザーではない)の名前を打ち込みましょう。次にPasswordも要求されますので、打ち込んでログインします。aaaというユーザー名でログインした場合、


*================================================
Welcome to Microsoft Telnet Server.
*================================================
C:\Documents and Settings\aaa>

こうなると思います。これで、MySQLにアクセスできそうですね。一般的にはこれくらいの設定で何とかなると思います。今回はここまで。お疲れ様でした。えらく長くなってしまったので、肝心のMySQLはまた今度にします。