SHOEISHA iD

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

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

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

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

MonoでPostgreSQL、MySQLを使う

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

DBアクセス

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

接続確認

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

select1.cs
using System;
using System.Data;
using Npgsql;

namespace PostgreSqlExample
{
  public class Select1
  {
    public static void Main(string[] args)
    {
      // 接続文字列
      string constr = "Server=localhost;Port=5432;User Id=postgres;Password=password;Database=TestData;";

      // SQL文字列
      string sstr   = "SELECT ProductID, ProductName, Price, ProductDescription " +
                        "FROM Products";

      using (NpgsqlConnection dbcon = new NpgsqlConnection(constr))
      {
        using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(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:Npgsql.dll
*
* 実行:
*
* mono select1.exe
*
*/
実行結果
> mono select1.exe
ID:0 NAME:PostgreSQL PRICE: DESCRIPTION:PostgreSQL 8.2.6
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head

動作確認

 動作確認用として、以下のコード(C#)を使用しました。動作確認用DBへのデータの登録、更新、削除を行う簡単なコンソールプログラムになります。データプロバイダファクトリを使用し、今回接続する各DBMS共通の動作確認プログラムとして使用します。また、データプロバイダファクトリ情報、接続先情報を保持する構成情報ファイルを使用します(動作確認で使用した、プログラムコード、構成情報ファイルを本稿に添付しました)。

main.cs から抜粋
using System;
using System.Configuration;
using System.Data;
using System.Data.Common;

namespace DbExample
{
  public class Client
  {
    private static DataTable dt;

    public static void Main(string[] args)
    {
      int rc;

      string s;
      string cs;
      string ph = "@"; // パラメータ識別子
      string dpstr;    // プロバイダ識別名
      string constr;   // 接続文字列

      // 接続先DBの選択
      START:
      Console.Write("Connect to\n1:SQLite\n2:PostgreSQL\n3:MySQL\n4:SqlServer\n5:Oracle\n?> ");
      s = Console.ReadLine();
      switch(s)
      {
        // SQLite
        case "1":
          cs = "Sqlite";
          break;
        // PostgreSQL
        case "2":
          cs = "Postgresql";
          ph = ":";
          break;
        // MySQL
        case "3":
          cs = "MySql";
          ph = "?";
          break;
        // SQL Server
        case "4":
          cs = "SqlServer";
          break;
        // Oracle
        case "5":
          cs = "Oracle";
          ph = ":";
          break;
        default:
          goto START;
      }

      // 構成情報ファイルから接続情報の取得
      ConnectionStringSettings css = ConfigurationManager.ConnectionStrings[cs];
      dpstr  = css.ProviderName;
      constr = css.ConnectionString;

      // DBプロバイダファクトリ作成
      DbProviderFactory dpf = DbProviderFactories.GetFactory(dpstr);
      using (DbConnection dbcon = dpf.CreateConnection())
      {
        dbcon.ConnectionString = constr;

        using (DbDataAdapter da = dpf.CreateDataAdapter())
        {
          // データアダプタの設定
          SetDataAdapter(dbcon, da, ph);

          // DB -> データテーブル
          rc = GetData(da);
          if (rc != 0)
          {
            return;
          }

          // データテーブルの内容を表示
          ShowData();

          s = "";
          while(s != "6")
          {
            Console.WriteLine();
            Console.Write("1:INSERT\n2:UPDATE\n3:DELETE\n4:SUBMIT\n5:RELOAD\n6:EXIT\n?> ");
            s = Console.ReadLine();
            switch(s)
            {
              // 行の追加
              case "1":
                InsertRow();
                goto default;
              // 行の更新
              case "2":
                UpdateRow();
                goto default;
              // 行の削除
              case "3":
                DeleteRow();
                goto default;
              // データテーブル -> DB
              case "4":
                SetData(dbcon, da);
                goto case "5";
              // 再読込 DB -> データテーブル
              case "5":
                GetData(da);
                goto default;
              // 終了
              case "6":
                break;
              // データテーブルの内容を表示
              default:
                ShowData();
                break;
            }
          }
        }
      }
    }

    - 省略 -

  }
}
/*
 * ビルド:
 *
 *   gmcs main.cs -out:client.exe -r:System.Configuration.dll -r:System.Data.dll
 *
 * 実行:
 *
 *   mono client.exe
 *
 */

 接続先情報を「cs.config」として別ファイルにしました。

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" />
</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;" />
</connectionStrings>
実行例(データの登録)
> mono client.exe
Connect to
1:SQLite
2:PostgreSQL
3:MySQL
4:SqlServer
5:Oracle
?> 2
状態:Unchanged ID:0 NAME:PostgreSQL PRICE: DESCRIPTION:PostgreSQL 8.2.6
状態: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:PostgreSQL PRICE: DESCRIPTION:PostgreSQL 8.2.6
状態: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
?> 4
状態:Unchanged ID:0 NAME:PostgreSQL PRICE: DESCRIPTION:PostgreSQL 8.2.6
状態: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: 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
?> 6

 大まかな処理の流れは、

  1. 接続対象DBの選択
    • 構成情報ファイルから接続情報の取得
    • データプロバイダファクトリの作成
  2. データプロバイダファクトリによるデータアダプタの作成
  3. データアダプタの設定
    • SELECT、INSERT、UPDATE、DELETE用各コマンドオブジェクトの登録
  4. データアダプタによるDBからデータテーブルへデータの取得
    • データアダプタのFillメソッド実行(「5:RELOAD」選択)
  5. データテーブルの内容を表示
  6. データテーブルへの操作
    • 「1:INSERT」選択 データテーブルへ行の追加
    • 「2:UPDATE」選択 データテーブルの行の更新
    • 「3:DELETE」選択 データテーブルの行の削除
  7. データアダプタによるデータテーブルからDBへデータの反映
    • 「4:SUBMIT」選択 データアダプタのUpdateメソッド実行

になります。

注意事項

パラメータ識別子

 SQL文字列内で使用するパラメータの識別子として、「@」および「:」が使用できます。動作確認用コードにおいて、パラメータ識別子の初期値として「@」を設定してあるので、あえて「:」を設定する必要はありませんが、確認用に追加しました。

DbProviderFactories

 Mono 1.9.1で「machine.config(2.0 profile)」に標準で登録されているデータプロバイダファクトリ情報は下表のとおりで、Npgsql用の設定を追加する必要があります。今回は動作確認用プログラムの構成情報ファイル内に記述することで対応しています。

データプロバイダファクトリ情報
データプロバイダ ファクトリクラス 概要
Mono.Data.SqliteClient Mono.Data.SqliteClient.SqliteFactory Mono Framework Data Provider for SQLite (old version)
Mono.Data.Sqlite Mono.Data.Sqlite.SqliteFactory Mono Framework Data Provider for SQLite (new version)
System.Data.Odbc System.Data.Odbc.OdbcFactory Data Provider for Odbc
System.Data.OleDb System.Data.OleDb.OleDbFactory Data Provider for OleDb
System.Data.OracleClient System.Data.OracleClient.OracleClientFactory Data Provider for Oracle
System.Data.SqlClient System.Data.SqlClient.SqlClientFactory Data Provider for SqlServer

 なお、Mono 1.9.1での「machine.config」の配置位置は

1.x profile:/etc/mono/1.0/machine.config
2.0 profile:/etc/mono/2.0/machine.config

になります。

おまけ

 MonodevelopからPostgreSQL DBへの操作(クエリの実行)が可能です。

 MonoDevelopを起動し、[データベースブラウザビュー]内の[データベース接続]アイコンを右クリックして[接続の追加]を選択し、以下の内容を入力します。

接続の追加
設定項目 設定内容
PostgreSQL database
名前 TestData(PostgreSQL 8.2.6)
サーバ localhost
ポート 5432
ユーザ名 postgres
パスワード password
データベース TestData

 MonoDevelopのメニューから[ツール]-[データベース]-[データベースをクエリ]を選択する(または、[データベースブラウザビュー]内の[TestData(PostgreSQL 8.2.6)]アイコンをダブルクリックする)と、SQLクエリ入力画面が表示されます。

次のページ
5.MySQL編

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

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

もっと読む

この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング