DBアクセス
データアダプタを使用したDBアクセスについての解説になります。
接続確認
接続確認用として、SELECT文を実行する以下のコード(C#)を使用しました。
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共通の動作確認プログラムとして使用します。また、データプロバイダファクトリ情報、接続先情報を保持する構成情報ファイルを使用します(動作確認で使用した、プログラムコード、構成情報ファイルを本稿に添付しました)。
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」として別ファイルにしました。
<?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>
<?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
大まかな処理の流れは、
- 接続対象DBの選択
- 構成情報ファイルから接続情報の取得
- データプロバイダファクトリの作成
- データプロバイダファクトリによるデータアダプタの作成
- データアダプタの設定
- SELECT、INSERT、UPDATE、DELETE用各コマンドオブジェクトの登録
- データアダプタによるDBからデータテーブルへデータの取得
- データアダプタのFillメソッド実行(「5:RELOAD」選択)
- データテーブルの内容を表示
- データテーブルへの操作
- 「1:INSERT」選択 データテーブルへ行の追加
- 「2:UPDATE」選択 データテーブルの行の更新
- 「3:DELETE」選択 データテーブルの行の削除
- データアダプタによるデータテーブルから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クエリ入力画面が表示されます。