プログラムコード
修正対応したSystem.Data.Odbcを使用します。文字列に対応するパラメータのDbTypeプロパティには明示的な設定をしていませんが、「DbType.AnsiString」が設定されているのと等価です(動作確認で使用したプログラムコード、構成情報ファイルを本稿に添付しました)。
...
// SELECT用コマンドオブジェクト設定
DbCommand dbcmd = dbcon.CreateCommand();
dbcmd.CommandText = sstr;
da.SelectCommand = dbcmd;
// INSERT用コマンドオブジェクト設定
dbcmd = dbcon.CreateCommand();
dbcmd.CommandText = istr;
// パラメータ設定
// P1
DbParameter param = dbcmd.CreateParameter();
param.DbType = DbType.Int32;
param.ParameterName = ph + "P1";
param.SourceColumn = "ProductID";
dbcmd.Parameters.Add(param);
// P2
param = dbcmd.CreateParameter();
param.ParameterName = ph + "P2";
param.SourceColumn = "ProductName";
dbcmd.Parameters.Add(param);
// P3
param = dbcmd.CreateParameter();
param.DbType = DbType.Decimal;
param.ParameterName = ph + "P3";
param.SourceColumn = "Price";
dbcmd.Parameters.Add(param);
// P4
param = dbcmd.CreateParameter();
param.ParameterName = ph + "P4";
param.SourceColumn = "ProductDescription";
dbcmd.Parameters.Add(param);
da.InsertCommand = dbcmd;
...
構成情報ファイル
構成情報ファイル(cs.config)に以下の内容を追加します。
<connectionStrings>
<add name="Sqlite" providerName="Mono.Data.Sqlite"
connectionString="Data Source=/home/sta/data/sqlite/TestData.db" />
<add name="Postgresql" providerName="Npgsql"
connectionString="Server=192.168.1.5;Port=5432;User Id=sta;Password=password;Database=TestData;" />
<add name="MySql" providerName="MySql.Data"
connectionString="Server=192.168.1.5;Database=TestData;Uid=sta;Pwd=password;CharSet=utf8" />
<add name="SqlServer" providerName="System.Data.SqlClient"
connectionString="Data Source=192.168.1.6,49174;Initial Catalog=TestData;User ID=sta;Password=passw0rd;Trusted_Connection=False" />
<add name="Oracle" providerName="System.Data.OracleClient"
connectionString="Server=192.168.1.5;User ID=testdata;Password=password;" />
<add name="Firebird" providerName="FirebirdSql.Data.FirebirdClient"
connectionString="Server=192.168.1.5;Database=/home/sta/data/firebird/TestData.fdb;User=sta;Password=password;Dialect=3;" />
<add name="DB2" providerName="System.Data.Odbc"
connectionString="DSN=TestData_DB2;UID=sta;PWD=password" />
</connectionStrings>
実行例
$ mono client2.exe Connect to 1:SQLite 2:PostgreSQL 3:MySQL 4:SQL Server 5:Oracle 6:Firebird 7:DB2 ?> 7 状態:Unchanged ID:0 NAME:DB2 PRICE: DESCRIPTION:DB2 Express-C 9.5.2 状態: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:DB2 PRICE: DESCRIPTION:DB2 Express-C 9.5.2 状態: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:DB2 PRICE: DESCRIPTION:DB2 Express-C 9.5.2 状態: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文内で使用できるパラメータは位置指定パラメータ「?」です。
string istr = "INSERT INTO Products(ProductID, ProductName, Price, ProductDescription) " +
"VALUES (?, ?, ?, ?)";
ちなみに今まで使用してきたデータプロバイダの中で位置指定パラメータを許してるのは、「Mono.Data.Sqlite」「FirebirdSql.Data.FirebirdClient」「System.Data.Odbc」で、他のデータプロバイダでは使用不可です。
DbProviderFactories
Mono 2.4の「machine.config(2.0 profile)」には「System.Data.Odbc」用のデータプロバイダファクトリ情報が標準で登録されているので、特に何かする必要はありません。
MonoDevelopは未対応
残念ながら、DB2用のアドインが存在しないので、MonoDevelopからDB2 DBへの操作(クエリの実行)はできませんでした。
6.まとめ
Mono環境上でのFirebird、DB2を使用したDBアクセスについて解説を行いました。
「Monoで他のDBも使ってみたよ!」シリーズでは、次のことが確認できました。
| DBMS | データプロバイダ | プロバイダファクトリ(ADO.NET 2.0)対応 |
| SQLite | Mono.Data.Sqlite | ◯ |
| PostgreSQL | Npgsql | ◯:Npgsql から提供されているデータプロバイダを使用 |
| MySQL | MySql.Data | ◯:Connector/Net から提供されているデータプロバイダを使用 |
| SQL Server | System.Data.SqlClient | ◯ |
| Oracle | System.Data.OracleClient | ◯:Mono 1.9.1 では実装対応が必要(Mono 2.4 ではその必要はない) |
| Firebird | FirebirdSql.Data.FirebirdClient | ◯:Firebird から提供されているデータプロバイダを使用 |
| DB2 | System.Data.Odbc | ◯:プロバイダファクトリ対応とは別だが、「動作確認」で解説した System.Data.Odbc の DB2 CLI/ODBC ドライバ対応が必要になる場合がある |
基本的なCRUD操作レベルですが、プロバイダファクトリを使用した汎用的なDB操作を試すことができました。
本稿で「Monoで他のDBも使ってみたよ!」シリーズは終了です。読んでいただいた方のなんらかの役に立ったなら幸いです。では、また。
