DBアクセス
データアダプタを使用したDBアクセスについて解説します。
接続確認
接続確認用として、SELECT文を実行する以下のコード(C#)を使用しました。
using System; using System.Data; using MySql.Data.MySqlClient; namespace MySqlExample { public class Select1 { public static void Main(string[] args) { // 接続文字列 string constr = "Server=192.168.1.2;Database=TestData;Uid=sta;Pwd=password;CharSet=utf8"; // SQL文字列 string sstr = "SELECT ProductID, ProductName, Price, ProductDescription " + "FROM Products"; using (MySqlConnection dbcon = new MySqlConnection(constr)) { using (MySqlDataAdapter da = new MySqlDataAdapter(sstr, dbcon)) using (DataTable dt = new DataTable()) { // SELECT実行 da.Fill(dt); foreach (DataRow dr in dt.Rows) { Console.WriteLine("ID:{0} NAME:{1} PRICE:{2} DESCRIPTION:{3}", dr[0], dr[1], dr[2], dr[3]); } } } } } } /* * ビルド: * * gmcs select1.cs -r:System.Data.dll -r:MySql.Data.dll * * 実行: * * mono select1.exe * */
> mono select1.exe ID:0 NAME:MySQL PRICE: DESCRIPTION:MySQL 5.0 Community Server ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires. ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
動作確認
「4.PostgreSQLーDBアクセスー動作確認」で使用したコンソールプログラムを使用して動作確認を行います。構成情報ファイルに以下の内容を追加します。
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <system.data> <DbProviderFactories> <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> <add name="MySQL ConnectorNet" invariant="MySql.Data" support="FF"
description="ADO.Net driver for MySQL"
type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=5.2.3.0, Culture=neutral, PublicKeyToken=793f2ad4907c83be" /> </DbProviderFactories> </system.data> <connectionStrings configSource="cs.config" /> </configuration>
<?xml version="1.0" encoding="UTF-8" ?> <connectionStrings> <add name="Sqlite" providerName="Mono.Data.Sqlite" connectionString="Data Source=/home/sta/data/TestData.db" /> <add name="Postgresql" providerName="Npgsql" connectionString="Server=localhost;Port=5432;User Id=postgres;Password=password;Database=TestData;" /> <add name="MySql" providerName="MySql.Data"
connectionString="Server=192.168.1.2;Database=TestData;Uid=sta;Pwd=password;CharSet=utf8" /> </connectionStrings>
> mono client.exe Connect to 1:SQLite 2:PostgreSQL 3:MySQL 4:SqlServer 5:Oracle ?> 3 状態:Unchanged ID:0 NAME:MySQL PRICE: DESCRIPTION:MySQL 5.0 Community Server 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Unchanged ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires. 状態:Unchanged ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION: 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 2 ID(int)?> 75 NAME(string)?> PRICE(num)?> 75 DESCRIPTION(string)?> タイヤ交換用の道具 状態:Unchanged ID:0 NAME:MySQL PRICE: DESCRIPTION:MySQL 5.0 Community Server 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Modified ID:75 NAME:Tire Bar PRICE:75 DESCRIPTION:タイヤ交換用の道具 状態:Unchanged ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION: 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 4 状態:Unchanged ID:0 NAME:MySQL PRICE: DESCRIPTION:MySQL 5.0 Community Server 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head 状態:Unchanged ID:75 NAME:Tire Bar PRICE:75.00 DESCRIPTION:タイヤ交換用の道具 状態:Unchanged ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION: 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 6
注意事項
パラメータ識別子
SQL文字列内で使用するパラメータの識別子として、「@」および「?」が使用できます。動作確認用コードにおいて、パラメータ識別子の初期値として「@」を設定してあるので、あえて「?」を設定する必要はありませんが、確認用に追加しました。
DbProviderFactories
Mono 1.9.1の「machine.config(2.0 profile)」には「MySql.Data」用のデータプロバイダファクトリ情報は登録されていないので、「machine.config」に追加する等の対応が必要になります。今回は動作確認用プログラムの構成情報ファイル内に記述することで対応しています。
おまけ
MonodevelopからMySQL DBへの操作(クエリの実行)が可能ですが、少し問題があります。実際、実行しようとするとデータプロバイダで解説した例外が再び発生してしまいます。
そこで「monodevelop-database」の配置先を確認してみると、「/usr/lib/monodevelop/AddIns/MonoDevelop.Database」配下に「MySql.Data.dll」が存在しています。一旦この「MySql.Data.dll」をリネームして、再度MonoDevelopを起動し、試してみましたが、DBへの接続からできなくなります。
そこで、「/usr/lib/monodevelop/AddIns/MonoDevelop.Database」配下に「/usr/lib/mono/2.0/MySql.Data.dll」へのシンボリックリンクを作成することで、一応の対応ができましたが、何だか変ですよね。ですが、ここは「おまけ」の節ということもあり、それほど深追いしないことにします。ご容赦下さい。
では、MonoDevelopを起動し、[データベースブラウザビュー]内の[データベース接続]アイコンを右クリックして[接続の追加]を選択し、以下の内容を入力します。
設定項目 | 設定内容 |
型 | MySQL database |
名前 | TestData(MySQL 5.0) |
サーバ | 192.168.1.2 |
ポート | 3306 |
ユーザ名 | sta |
パスワード | password |
データベース | TestData |
MonoDevelopのメニューから[ツール]-[データベース]-[データベースをクエリ]を選択する(または、[データベースブラウザビュー]内の[TestData(MySQL 5.0))]アイコンをダブルクリックする)とSQLクエリ入力画面が表示されます。
後半では
「Monoで他のDBも使ってみたよ!(SQL Server、Oracle編)」に続きます(近日公開予定)。