このブログの MySQL の記事をまとめていると「あれ?意外に少ない」と気が付いて、ADO.NET 絡みでMySQLを扱うTipsでも追加しようかと探していたところなのですが、なんと、LINQ で MySQL を使えることを発見。と言いますか、「至高の技」の執筆中に確認しなかったのが痛恨の一撃。
MySQL :: MySQL 5.1 Reference Manual :: 20.2.4.5 Tutorial: Using an Entity Framework Entity as a Windows Forms Data Source
http://dev.mysql.com/doc/refman/5.6/en/connector-net-tutorials-entity-framework-winform-data-source.html
どうも、日本語の情報が少ないなぁと思っていたら、該当するマニュアルは英語版しかないみたいですね。mysql linq で検索するあまり日本語のページは引っ掛かりません。
ざっと、英語のマニュアルを読めば分かるのですが、手順は非常に簡単です。SQL Server を LINQ で使うのと同じように、MySQL も DataAdapter 経由で LINQ を使うことができます。.NET Framework v4.0 からは、ここの ADO.NET 絡みが大きく変わっているので、かなり楽になっています。
という訳で、簡単に手順など。C# でサンプルコードを書いていますが、VB でも同じことができます。
■ADO.NET Data Entity Model を作成
0. 最初に MySQL :: Download Connector/Net から、Connector/Net 6.4.4 をダウンロードして、インストールしておきます。
1.「新しい項目の追加」で「ADO.NET Entity Data Model」を追加します。
2.「データベースから生成」で「次へ」
3.「新しい接続」ボタンをクリック
4.「変更」をクリック
5.「MySQL Database」をクリックして「.NET Framework Data Prodvider for MySQL」を選択。
6.「接続のプロパティ」で、サーバー名などを設定
7.「詳細設定」ボタンをクリックしたあと、「Allow Zero Datetime」を「True」、「Convert Zero Datetime」を「Ture」」に変更しておく。
これは、MySQL の Datetime は「0000-00-00 00:00:00」が許されるのですが、.NET の Datetime は「1900-01-01」あたりが最小値なためにエラーがでるため、これを自動でコンバートします。
「Unable to convert MySQL date/time value to System.DateTime」という例外が発生したら、ここを設定してみてください。
8.後は、テーブルを選択してエンティティクラスを自動生成します。ここでは、wordpress のテーブルから作成しています。
ここまで出来れば普通にSQL Sever で使う時のように LINQ が使えます。どうやら、sqlite も同じパターンなので、後で試して見る予定です。
■LINQ で検索する
DataGridView を使って、単純に一覧を表示した例です。
1 2 3 4 5 6 7 | private void button1_Click( object sender, EventArgs e) { // 単純に post テーブルの内容を表示 wordpressEntities ent = new wordpressEntities(); var posts = from t in ent.wp_posts select t; dataGridView1.DataSource = posts; } |
公開されている記事だけを検索する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | private void button2_Click( object sender, EventArgs e) { // 公開している記事一覧を表示 wordpressEntities ent = new wordpressEntities(); /* select id, post_date, post_title, post_status, post_type from wp_posts where post_status = 'publish' and post_type = 'post' order by post_date desc */ var posts = from t in ent.wp_posts where t.post_status == "publish" && t.post_type == "post" orderby t.post_date descending select new { t.ID, t.post_title, t.post_date }; // バインド dataGridView1.DataSource = posts; } |
そんな訳で、LINQ to MySQL(という名前ではないけれど)は簡単に利用できます。wordpress などの oss の場合には mysql が使われていることが多いので、解析したり修正したりするときには勢い php になってしまうんですよね。自分が python あたりが使えるようになると、また別なんでしょうが、どうせならば .NET 関係のツールで揃えられれば windows から扱うのも手軽になるかなと。特に gui は作り易いですからね。
簡単なデータ更新の話とか、統計用の SlimStat のテーブル調査なんかは後ほど時間を取ってやっていこうと思います。SlimStat は、CakePHP から SlimStat へアクセスする(準備) | Moonmile Solutions Blog で準備だけして、頓挫しているので .NET のチャートが使えると結構便利なので。