SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MonoでDBMS用データプロバイダを使う

Monoで他のDBも使ってみたよ!(Firebird、DB2編)

MonoでFirebird、DB2を使う

  • X ポスト
  • このエントリーをはてなブックマークに追加

プログラムコード

 修正対応したSystem.Data.Odbcを使用します。文字列に対応するパラメータのDbTypeプロパティには明示的な設定をしていませんが、「DbType.AnsiString」が設定されているのと等価です(動作確認で使用したプログラムコード、構成情報ファイルを本稿に添付しました)。

client2.cs から抜粋
...
      // 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)に以下の内容を追加します。

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も使ってみたよ!」シリーズは終了です。読んでいただいた方のなんらかの役に立ったなら幸いです。では、また。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
MonoでDBMS用データプロバイダを使う連載記事一覧

もっと読む

この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3975 2009/08/28 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング