読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

ASP.NET WebページでOracle DBを使ってみる


ASP.NET WebページでOracleに接続する方法をちょっと試してみたのでメモ。

考えてみたパターンは以下の四つ。

  • WebMatrix.Data.Databaseを使うパターン
    • [1] System.Data.OracleClientを使う
    • [2] System.Data.OleDb経由でOracle製のOLE DBドライバを使う
    • [3] System.Data.Odbc経由でOracle製のODBCドライバを使う
  • WebMatrix.Data.Databaseを使わないパターン
    • [4] OPD.NETを使う


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>
備考:

DBをオープンしてからの書き方は、パターン[1]と全く同じです。
こちらはOracle純正のOLE DBクライアントを利用します。こちらはおそらく、しばらくはこれもリリースされ続けると思いますので、将来性はこちらの方が上かもしれません。
性能的・機能的にパターン[1]とどちらが良いかよく解りませんので、ご存知方がおられたら、ぜひ教えていただければと思います。


これはOracle以外でも、OLE DBのドライバが用意されていればなんでもいけるんじゃないかとおもいます。

[3] System.Data.Odbc経由でOracle製の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 ServerSQL Server CE、あとMySQL等以外にも、ODBCやOLE DB等が使えるデータベースであればWebMatrix.Data.Databaseクラスを使って比較的簡易な書き方でDBにアクセスをすることとができます。
また、ODP.NET等の.NET Framework用のプロバイダもほぼ今まで通りの書き方で使うことも可能なようです*2

知りたいこと

誰か、以下についてご存知でしたら教えてください

  • ODP.NETをWebMatrix.Data.DataBaseのプロバイダとして使えるのか否か。使える場合はその使い方
  • WebMatrix.Data.Databaseを使うか従来の.NETでのDB接続を使うかをどういう観点で判断すればよいか
  • ASP.NET WebパージでOracleを使う場合に「これが王道だ!」というパターン
  • 本エントリに間違い等あれば!!

*1:http://msdn.microsoft.com/ja-jp/library/system.data.oracleclient%28v=VS.100%29.aspx に「互換性のために残されています」と記述されています。

*2:というより、OPD.NET(Oracle.DataAccess)をプロバイダに指定してWebMatrix.Data.Databaseを使いたかったけど、どうやってもうまいこと行かなかった