SHOEISHA iD

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

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

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

Monoで他のDBも使ってみたよ!(SQL Server、Oracle編)

MonoでSQL Server、Oracleを使う

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

ダウンロード 修正サンプル (125.0 KB)

DBアクセス

 データアダプタを使用したDBアクセスについて解説します。

接続確認

 接続確認用として、SELECT文を実行する以下のコード(C#)を使用しました。

select1.cs
using System;
using System.Data;
using System.Data.OracleClient;

namespace OracleExample
{
  public class Select1
  {
    public static void Main(string[] args)
    {
      // 接続文字列
      string constr = "Server=192.168.1.2;" +
"User ID=testdata;" +
"Password=password;";
// SQL文字列 string sstr = "SELECT ProductID, ProductName, Price, ProductDescription " + "FROM Products"; using (OracleConnection dbcon = new OracleConnection(constr)) { using (OracleDataAdapter da = new OracleDataAdapter(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:System.Data.OracleClient.dll * * * 実行: * * mono select1.exe * */
実行結果
> mono select1.exe
ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition
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アクセスー動作確認」で使用したコンソールプログラムを使用して動作確認を行います。構成情報ファイル(cs.config)に以下の内容を追加します。

cs.config
<?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" />
  <add name="SqlServer" providername="System.Data.SqlClient"
    connectionstring="Data Source=192.168.1.2,1031;Initial Catalog=TestData;User ID=sta;Password=passW0rd;Trusted_Connection=False" />
  <add name="Oracle" providerName="System.Data.OracleClient"
connectionString="Server=192.168.1.2;User ID=testdata;Password=password;" />
</connectionStrings>
実行例(データの登録、更新、削除)
> mono client.exe
Connect to
1:SQLite
2:PostgreSQL
3:MySQL
4:SqlServer
5:Oracle
?> 5
状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition
状態: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
?> 1
ID(int)?> 2
NAME(string)?> test
PRICE(num)?> 2
DESCRIPTION(string)?> for test
状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition
状態: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:
状態:Added ID:2 NAME:test PRICE:2 DESCRIPTION:for test

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:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition
状態: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:
状態:Added ID:2 NAME:test PRICE:2 DESCRIPTION:for test

1:INSERT
2:UPDATE
3:DELETE
4:SUBMIT
5:RELOAD
6:EXIT
?> 3
ID(int)?> 3000
状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition
状態: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:タイヤ交換用の道具
状態:Added ID:2 NAME:test PRICE:2 DESCRIPTION:for test

1:INSERT
2:UPDATE
3:DELETE
4:SUBMIT
5:RELOAD
6:EXIT
?> 4
状態:Unchanged ID:0 NAME:Oracle PRICE: DESCRIPTION:Oracle Database 10g Express Edition
状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
状態:Unchanged ID:2 NAME:test PRICE:2 DESCRIPTION:for test
状態:Unchanged ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
状態:Unchanged ID:75 NAME:Tire Bar PRICE:75 DESCRIPTION:タイヤ交換用の道具

1:INSERT
2:UPDATE
3:DELETE
4:SUBMIT
5:RELOAD
6:EXIT
?> 6

注意事項

パラメータ識別子

 SQL文字列内で使用するパラメータの識別子として、「:」が使用できます。今回、動作確認を行ったOracle以外のDBMSでは、「@」が使用できるので、Oracleを使用しない場合は、パラメータ識別子に配慮する必要はなくなります。

DbProviderFactories

 Mono 1.9.1の「machine.config(2.0 profile)」には「System.Data.OracleClient」用のデータプロバイダファクトリ情報が標準で登録されているので、特に何か追加する等の対応は必要ありません。

おまけ

 残念ながら、「monodevelop-database」(MonoDevelop用アドイン)パッケージには、Oracle用のアドインが存在しないので、MonoDevelopからOracle DBへの操作(クエリの実行)はできませんでした。

8.まとめ

 MonoとPostgreSQL、MySQL、SQL Server、Oracleを使用したDBアクセスについて解説を行いました。SQLiteを含めると、5つのDBMSへのデータプロバイダファクトリを使用した汎用的なコード記述によるDBアクセスを試すことができました。MonoでのADO.NET 2.0サポートをある程度確認できたことになると思います。

 さて、ぼやほやしているうちにMono 2.0がリリースされてしまいました。Mono 2.0ではLINQ to * が充実しつつあるようです。もともとMonoでLINQ to SQLを試そうと調べ始めましたが、「Mono 1.9.1では標準でLINQ to SQL(System.Data.Linq)は提供されていない」→「LINQ to SQLはLINQ to SQL Serverなの!?」→「意気消沈」という変遷を経て、もっと基本的なことから試してみよう、と持ち直した結果が、前回と今回の記事を書くことにつながりました。

 また機会があれば、Mono 2.0以降でのLINQ to * 関連や、MonoでのDBアクセス以外の動作についても紹介したいと思います。ではまた。

参考資料

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

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

もっと読む

この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング