プログラムコード
修正対応した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も使ってみたよ!」シリーズは終了です。読んでいただいた方のなんらかの役に立ったなら幸いです。では、また。