ADO.NET2.0 を使って、PostgreSQLからデータを取得する
まず、前提として ADO.NET2.0の標準のドライバは SQL ServerかOracleか、もしくはODBCしか使えません。しかし、Npgsql.Netを使えば ODBC経由ではなく PostgreSQLに接続することができます。以降では、Npgsqlがインストールしてある前提で話をするので、こちらから最新版のバイナリをダウンロードして、インストールをしてください。
データ構造については、Javaでの ORマッピングの比較 - しがないプログラマ の日記 の時と同じものを使うことにします。
それでは、まず VisualStudio2005で コンソールプロジェクトを作成し、上記の Npgsqlの参照を追加します。
DataSetを新規で追加し、以下のように「DataTable」を追加します*1。
ADO.NETを使うので、DbProviderFactory 経由で Npgsqlを使うために、App.configファイルを新規で追加し 以下のように記述します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.data> <DbProviderFactories> <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> </DbProviderFactories> </system.data> </configuration>
あとは、Mainメソッドを以下のように記述すればデータの取得ができます。
using System; using System.Data; using System.Data.Common; namespace OrmCompareAdo { class Program { static void Main(string[] args) { DbProviderFactory factory = DbProviderFactories.GetFactory("Npgsql"); using (DbConnection conn = factory.CreateConnection()) { conn.ConnectionString = @"Server=localhost;User id=postgres;Password=postgres;Database=test;Encoding=Unicode"; conn.Open(); using (DataSet1 set = new DataSet1()) { FillData(factory, conn, set, "HUSER_GROUP"); FillData(factory, conn, set, "HUSER"); set.Relations.Add(set.HUSER_GROUP.USER_GROUP_IDColumn, set.HUSER.USER_GROUP_IDColumn); foreach (DataSet1.HUSER_GROUPRow row in set.HUSER_GROUP) { Console.WriteLine(row.USER_GROUP_ID + ":"); foreach (DataSet1.HUSERRow user in row.GetChildRows(set.Relations[0])) { Console.WriteLine(string.Format(" {0}/{1}", user.USER_ID, user.PASSWORD)); } } } } // コンソールが閉じないように Console.ReadLine(); } private static void FillData(DbProviderFactory factory, DbConnection conn, DataSet1 set, string tableName) { DbCommand command = factory.CreateCommand(); command.CommandText = string.Format("SELECT * FROM {0}", tableName); command.Connection = conn; DbDataAdapter adapter = factory.CreateDataAdapter(); adapter.SelectCommand = command; adapter.Fill(set, tableName); } } }
データの更新を行いたい場合には、FillDataメソッド内で DbDataAdapterを作成しているので、この Adapterに下記のように DbCommandBuilderを設定してあげることで、INSERTやUPDATE文は自動生成されます。
DbCommandBuilder builder = factory.CreateCommandBuilder(); builder.DataAdapter = adapter;
追記:上記のソースを、Subversionにて取得できるようにしました。http://taoe.jpn.ch:8080/svn/trunk/orm_compare/ADO.NET にあります。
*1:TableAdapterは、Npgsql用には作成できないようです