DBアクセス
データアダプタを使用したDBアクセスについての解説です。
接続確認
接続確認用として、SELECT文を実行する以下のコード(C#)を使用します。
using System;
using System.Data;
using FirebirdSql.Data.FirebirdClient;
namespace FirebirdExample
{
public class Select1
{
public static void Main(string[] args)
{
// 接続文字列
string constr = "Server=192.168.1.5;" +
"Database=/home/sta/data/firebird/TestData.fdb;" +
"User=sta;" +
"Password=password;" +
"Dialect=3;";
// SQL文字列
string sstr = "SELECT ProductID, ProductName, Price, ProductDescription " +
"FROM Products";
using (FbConnection dbcon = new FbConnection(constr))
{
using (FbDataAdapter da = new FbDataAdapter(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:FirebirdSql.Data.FirebirdClient.dll
*
* 実行:
*
* mono select1.exe
*
*/
$ mono select1.exe ID:0 NAME:Firebird PRICE: DESCRIPTION:Firebird 2.1.1 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:
動作確認
前回と同様の各DBMS共通の動作確認用コード(C#)を使用します。動作確認用DBへのデータの登録、更新、削除を行う単純なコンソールプログラムですが、Firebird用に以下の追加修正を行います(動作確認で使用したプログラムコード、構成情報ファイルを本稿に添付しました)。
プログラムコード
...
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\n6:Firebird\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;
// Firebird
case "6":
cs = "Firebird";
break;
default:
goto START;
}
...
構成情報ファイル
<?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.5.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=6.0.3.0, Culture=neutral, PublicKeyToken=afb1e9499f4f0f5a" />
<add name="Firebird .NET Data Provider" invariant="FirebirdSql.Data.FirebirdClient" support="FF"
description=".Net Framework Data Provider for Firebird"
type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.1.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c" />
</DbProviderFactories>
</system.data>
<connectionStrings configSource="cs.config" />
</configuration>
<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;" />
</connectionStrings>
実行例
$ mono client1.exe Connect to 1:SQLite 2:PostgreSQL 3:MySQL 4:SqlServer 5:Oracle 6:Firebird ?> 6 状態:Unchanged ID:0 NAME:Firebird PRICE: DESCRIPTION:Firebird 2.1.1 状態: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.2 DESCRIPTION(string)?> テスト用 状態:Unchanged ID:0 NAME:Firebird PRICE: DESCRIPTION:Firebird 2.1.1 状態: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.2 DESCRIPTION:テスト用 1:INSERT 2:UPDATE 3:DELETE 4:SUBMIT 5:RELOAD 6:EXIT ?> 4 状態:Unchanged ID:0 NAME:Firebird PRICE: DESCRIPTION:Firebird 2.1.1 状態:Unchanged ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp 状態:Unchanged ID:2 NAME:test PRICE:2.2 DESCRIPTION:テスト用 状態: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
注意事項
パラメータ識別子
SQL文内で使用するパラメータの識別子として、「@」が使用できます。
DbProviderFactories
Mono 2.4の「machine.config(2.0 profile)」には「FirebirdSql.Data.FirebirdClient」用のデータプロバイダファクトリ情報は登録されていないので、「machine.config」に追加する等の対応が必要になります。今回は動作確認用プログラムの構成情報ファイル内に記述することで対応しています。
MonoDevelopは未対応
残念ながら、Firebird用のアドインが存在しないので、MonoDevelopからFirebird DBへの操作(クエリの実行)はできませんでした。
