ADO.NET2.0 を使って、PostgreSQLからデータを取得する

まず、前提として ADO.NET2.0の標準のドライバは SQL ServerOracleか、もしくは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用には作成できないようです