CodeZine(コードジン)

特集ページ一覧

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

MonoでPostgreSQL、MySQLを使う

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/12/23 14:00
目次

DBアクセス

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

接続確認

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

select1.cs
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アクセスー動作確認」で使用したコンソールプログラムを使用して動作確認を行います。構成情報ファイルに以下の内容を追加します。

client.exe.config
<?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>
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" />
</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文字列内で使用するパラメータの識別子として、「@」および「?」が使用できます。動作確認用コードにおいて、パラメータ識別子の初期値として「@」を設定してあるので、あえて「?」を設定する必要はありませんが、確認用に追加しました。

補足説明
 「MySql.Data(Connector/NET)」では標準のパラメータ識別子は「?」で、「@」については、接続文字列内の設定項目として「Old Syntax」を有効にすることにより、使用可能になっていました(もともとは標準で「@」が使用可能だったかららしい)。今回使用した「Sources (ZIP)」版資源内の「Release Notes.txt」によると「Connector/Net 5.2」から、「Old Syntax」の設定は無効となり、標準で「@」が使用できるようになったと記されています。要望多数によりそうしたよ、という感じですが、何かイイですね。
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編)」に続きます(近日公開予定)。

参考資料



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

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

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5