H2を.NETで使用する(ODBC編)

H2を.NETで使用する方法については過去に2度書いています。そこではH2Sharpを使用する方法について書きました。今回はそれらと異なる方法である「ODBCを使用する方法」について書きます。

はじめに書いておきますと、ODBC Driverの使用については、公式サイトに記述があります。当エントリはその内容とほぼ同様のものです。

きっかけ

H2Sharpを修正してDbProviderFactoryに対応させたり、ゼロから書き直してみたりと遊んでいたのですが、ふと思ったのです。「遠回りすぎる」と。

H2Sharpが行っているのは、H2のJARファイルをIKVMを使用してDLLファイルに変換することで.NETからJDBCを使用できるようにしておき、JDBC APIADO.NET APIで使用できるようにラップすることです。遠回りな感じがしませんか。使用時にIKVMのDLLファイルが必要になるのも面倒です。

そこで、まったく別の方法をとることにしました。

ODBCを使用する方法

H2はODBCに対応しているようです。昔はODBC Driverに独自の実装により対応していたそうなのですが、現在はそれをやめ、PostgreSQL ODBC Driverと互換性を持たせることで動作させているようです。

ODBCでの接続では、速度や機能には制限がかかるでしょうが、Data Providerが標準提供されているのでアプリケーション側に追加のDLLは不要です。

ODBCおよびPostgreSQL ODBC Driverに依存してしまうため、機能的な制限がかかるほか、PostgreSQL ODBC Driverのバージョンアップにより動作しなくなる可能性があるため、「製品アプリケーションでは使用すべきでありません」と公式サイトに書かれています。今回は、僕の趣味なので、関係ありませんね。

目標の構成は次の通りです。「H2 ⇔ ODBC(PostgreSQL ODBC Driver) ⇔ ODBC .NET Data Provider」

PostgreSQL ODBC Driverのインストール

WindowsPostgreSQL ODBC Driverはhttp://www.postgresql.org/ftp/odbc/versions/msi/で配布されています。H2ではバージョン8.2以降に対応しているようです。64bitOSであっても32bitアプリケーションから使用する場合は32bit版を使用してください。

H2の起動

H2がPostgreSQL ODBC Driverに対応するためには、起動方法を変更する必要があります。

通常、起動時に使用する「h2.bat」の中では「org.h2.tools.Console」が使用されていますが、これを「org.h2.tools.Server」に変更しておきます。

ODBCの設定

次にODBCの設定を行います。

Windows7の場合は「管理ツール」 > 「データソース(ODBC)」から「ODBC データソース アドミニストレーター」を立ち上げます。

もし、32bitアプリケーションから使用する場合は「c:\windows\SysWOW64\odbcad32.exe」から「ODBC データソース アドミニストレーター」を立ち上げることで、32bit用のODBC Driverの設定ができます。

プロパティ 意味
データソース名 任意の名前
サーバー名 localhost
データベース名 H2の接続先データベース名
ユーザー名 H2の接続先データベースのユーザー名
パスワード H2の接続先データベースのパスワード
SSL 無効(H2は対応していないそうです)
ポート番号 5435(H2はこの番号で待ち受けしています)

「サーバ側Prepare」をONにしておくと高速化を期待できます。

設定の際はH2 DB Engine インストール・設定 技術メモを参考にすると良いです。画像ありで説明されています。

ODBC .NET Data Providerから接続する

普段.NETからODBCを使用する際と同じ手順です。接続文字列については、http://msdn.microsoft.com/library/system.data.odbc.odbcconnection.connectionstringを参照するといいです。

DbProviderFactoryにも当然対応しています。

var factory = DbProviderFactories.GetFactory("System.Data.Odbc");
using (var connection = factory.CreateConnection())
{
    var dataSourceName = "H2Test";
    var username = "sa";
    var password = "password";
    var csb = new StringBuilder();
    csb.Append("DSN=").Append(dataSourceName).Append(";");
    csb.Append("UID=").Append(username).Append(";");
    csb.Append("PWD=").Append(password).Append(";");
    connection.ConnectionString = csb.ToString();
    connection.Open();
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "CREATE TABLE tbl( id INT PRIMARY KEY, name CHAR(10) )";
        command.ExecuteNonQuery();
    }
}

ね、簡単でしょ?