MySQL にアクセスする
Windows 10 / Visual Stadio Community 2019 / .net 5.0
本章では C# のアプリケーションからMySQLのデータを読み込む方法について説明する。
前提として、MySQLはリモートサーバーにあるものとする。ここでは、C# アプリケーションが MySQLに直接リモートログインする方法と、アプリケーションが Webサーバーを経由して MySQLのデータを利用する方法の2つを紹介する。
MySQLにリモートログインする方法
データベースへ接続する
SQLコマンドによるデータの取得
(1) 辞書の配列を返す
SELECTコマンドで取得したデータを辞書の配列にして返す。辞書のキーは SELECT文の列名になる。
(2) データテーブルを返す
SELECTコマンドで取得したデータをデータテーブルオブジェクトにして返す。DataTableクラスの Loadメソッドを一回呼ぶだけで全データを読み込むことができる。データテーブルのカラム名は SELECT文の列名になる。
(3) 既存のデータテーブルにデータをロードする
上記のメソッドとほぼ同じ処理だが、取得したデータセットは引数で指定されたデータテーブルに上書きする。戻り値はない。データテーブルを使い回したいときに使用する。
接続の切断
ソースコード全体
MySQL.cs
Webサーバーを経由してMySQLのデータを利用する方法
C#アプリケーションはWebサーバとHTTPコマンドを使ってデータの送受信を行う。
データベースに接続し、SQLコマンドを実行してデータを取得しクライアントに返すのは、Webサーバー上のスクリプト(PHP+SQL)の仕事となる。
本例は、指定した期間の血圧データをデーターベースから取得する処理である。アプリケーションは、起動するPHPスクリプトのURLとパラメーターに期間を指定しPOSTマンドを送信する。処理の結果は、JSON形式のデータとして返ってくる。内容は SELECT文の列名をキーに、取得したデータを値として持つ辞書型のレコードの配列となる。
POSTコマンドの終了を待つために、async + await のマルチスレッド機能を利用する。
参考までに、PHPスクリプトを示す。
[疑問] マルチスレッド機能が思い通りに動作しない
上に例示したコードは問題なく動く。これを、POSTコマンドの送受信の部分を切り出し関数とし、呼び出すようにしたのが次のコードである。
ところがこの処理を実行すると await client.PostAsync(...) から返ってこない。単純に処理の一部を関数化しただけなのに、こうなってしまうのは、どうにもよくわからない。なぜ?(全然納得できない)
ソースコード全体
Form1.cs