H2を.NETで使用する(ODBC編)
H2を.NETで使用する方法については過去に2度書いています。そこではH2Sharpを使用する方法について書きました。今回はそれらと異なる方法である「ODBCを使用する方法」について書きます。
はじめに書いておきますと、ODBC Driverの使用については、公式サイトに記述があります。当エントリはその内容とほぼ同様のものです。
きっかけ
H2Sharpを修正してDbProviderFactoryに対応させたり、ゼロから書き直してみたりと遊んでいたのですが、ふと思ったのです。「遠回りすぎる」と。
H2Sharpが行っているのは、H2のJARファイルをIKVMを使用してDLLファイルに変換することで.NETからJDBCを使用できるようにしておき、JDBC APIをADO.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のインストール
Windows版PostgreSQL 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(); } }
ね、簡単でしょ?
リンク
- H2公式(http://www.h2database.com/)
- H2Sharp公式(http://code.google.com/p/h2sharp/)
- 過去記事1『H2を.NETで使用する』 - bouzuya@hateda(http://d.hatena.ne.jp/bouzuya/20100919/1284877546)
- 過去記事2『H2SharpはDbProviderFactoryに対応していない』 - bouzuya@hateda(http://d.hatena.ne.jp/bouzuya/20100922/1285158019)
- 設定参考H2 DB Engine インストール・設定 技術メモ(http://homepage2.nifty.com/yoks/TechNote/H2/H2_ope4.htm)
- H2 Database Engine、独自のODBCドライバ開発を終了 - DB開発に注力 | エンタープライズ | マイコミジャーナル