ASP.NET WebページでOracleに接続する方法をちょっと試してみたのでメモ。
考えてみたパターンは以下の四つ。
※Oracleの接続情報は以下とします
ネットサービス名:myOracleDB
ユーザ:scott
パスワード:tiger
[1] System.Data.OracleClientを使う
.NET Frmeworkに含まれている、Microsof製のOracle接続用ドライバです。
Web.Configへの接続文字列設定例:
<configuration> <connectionStrings> <add name="MyConStr" connectionString="user id=scott;password=tiger;data source=myOracleDB;" providerName="System.Data.OracleClient"/> </connectionStrings> </configuration>
アクセスするコードの書き方例:
<body> @{ var db = Database.Open("MyConStr"); var rec = db.Query("SELECT name, address, tel FROM hoge"); } <table> @foreach (var row in rec) { <tr> <td>@row.name</td> <td>@row.address</td> <td>@row.tel</td> </tr> } </table> </body>
備考:
見ての通り、とっても簡単です。
ただし、このSystem.Data.OracleClientは.NET Framework 4.0以降は非推奨となっている*1こと等から、少なくとも積極的に新規に採用するべきではないと思います。
[2] System.Data.OleDb経由でOracle製のOLE DBドライバを使う
System.Data.OleDbクラスを使い、Oracle製のOLE DBドライバでアクセスする方法です。
Web.Configへの接続文字列設定例:
<configuration> <connectionStrings> <add name="MyConStr" connectionString="Provider=OraOLEDB.Oracle;Data Source=myOracleDB;User Id=scott;Password=tiger;" providerName="System.Data.OleDb"/> </connectionStrings> </configuration>
アクセスするコードの書き方例:
<body> @{ var db = Database.Open("MyConStr"); var rec = db.Query("SELECT name, address, tel FROM hoge"); } <table> @foreach (var row in rec) { <tr> <td>@row.name</td> <td>@row.address</td> <td>@row.tel</td> </tr> } </table> </body>
[3] System.Data.Odbc経由でOracle製のODBCドライバを使う
Web.Configへの接続文字列設定例:
※この記述はOracleクライアントの環境に依存します。
<configuration> <connectionStrings> <add name="MyConStr" connectionString="Driver={Oracle in OraClient11g_home1};DBQ=myOracleDB;UID=scott;PWD=tiger;" providerName="System.Data.Odbc"/> </connectionStrings> </configuration>
アクセスするコードの書き方例:
<body> @{ var db = Database.Open("MyConStr"); var rec = db.Query("SELECT name, address, tel FROM hoge"); } <table> @foreach (var row in rec) { <tr> <td>@row.name</td> <td>@row.address</td> <td>@row.tel</td> </tr> } </table> </body>
備考:
こちらも、DBをオープンしてからの書き方は、パターン[1]と全く同じです。
OLE DBが使える環境なら、こちらを採用する必要はないと思いますが、もし、OLE DBドライバが無いDB等の場合はこちらの方法がつかえるかもしれません。
もちろんローカルにODBCデータソースを作成してそれを使うことも可能で、その場合は接続文字列は"Dsn=<データソース名>;uid=scott;pwd=tiger;"のようになります。
[4] OPD.NETを使う
Oracle純正の.NET用ドライバ、ODP.NETを使うパターンです。
Web.Configへのアセンブリ参照設定:
※今回、接続文字列は直接ソース側に書きました。
※この記述はODP.NETのバージョンに依存します
<configuration> <connectionStrings> <add name="MyConStr" connectionString="data source=myOracleDB;user id=scott;password=tiger;" /> </connectionStrings> <system.web> <compilation debug="true"> <assemblies> <add assembly="Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89B483F429C47342" /> </assemblies> </compilation> </system.web>
アクセスするコードの書き方例:
<body> @using (Oracle.DataAccess.Client.OracleConnection cn = new Oracle.DataAccess.Client.OracleConnection( System.Configuration.ConfigurationManager.ConnectionStrings["MyConStr"].ConnectionString ) { cn.Open(); Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand(); cmd.Connection = cn; cmd.CommandText = "SELECT name, address, tel FROM hoge"; using (Oracle.DataAccess.Client.OracleDataReader dr = cmd.ExecuteReader()) { <table> @while (dr.Read()) { <tr> <td>@dr["name"]/td> <td>@dr["address"]</td> <td>@dr["tel"]</td> </tr> } </table> } } </body>
備考:
WebMatrix.Data.Databaseを使っていないので、[1]〜[3]と全く異質なコードになっています。
ODP.NETを使って普通に.NET Frameworkで開発するときと同じですね。
多分、他の.NET用のプロバイダも同様、使おうと思えばほぼ今まで通りの書き方で利用できると思います。
ただし、Web.Configの記述を見てもらえればわかるとおり、アセンブリの参照を解決してやる必要があります。Visual Studioを利用する場合はいつも通りの[参照の追加]から可能ですが、WebMatrixでやる場合はツールのサポートが無いので自力で書く必要があるようです。
まとめ
WebMatrixのサイトに紹介のあるSQL ServerやSQL Server CE、あとMySQL等以外にも、ODBCやOLE DB等が使えるデータベースであればWebMatrix.Data.Databaseクラスを使って比較的簡易な書き方でDBにアクセスをすることとができます。
また、ODP.NET等の.NET Framework用のプロバイダもほぼ今まで通りの書き方で使うことも可能なようです*2。
知りたいこと
誰か、以下についてご存知でしたら教えてください