意外と簡単!? Webアプリケーション編「ASP.NET」

日本オラクル クロスインダストリー統括本部
OracleDirect テクニカルサービスグループ
大田 浩


目次
はじめに
ASP.NETでOracle Data Provider For .NETの使用
サンプルアプリケーションのインストール
ASP.NETからのLOBの扱い
ASP.NETアプリケーションのセキュリティについて
ODP.NETでのエラーハンドリング
ODP.NETとWebサーバーコントロールの連携
ODP.NETのデバッグ・トレース機能の利用
文キャッシングについて
グローバリゼーションのサポート


 はじめに

「意外と簡単!? .NETでOracle」シリーズではMicrosoft Visual Studio.NETを使用してOracle10g対応アプリケーションをこれから開発されるかた向けに作成しております。
実際のサンプルアプリケーションを提供することにより、単なるコーディングTipsにとどまらず、より実践的なアプリケーション開発の資料として構成するようにしております。
「.NETからオラクルへの接続にはさまざまな方法が存在しますが、「意外と簡単!? .NETでOracle」シリーズではオラクル社が提供している.Oracle Data Provider for .NETを利用しており、開発言語はVisual Basic.NETを使用しております。今回のサンプルアプリケーションの説明はポイントとなる部分のみの説明になりますので予めご了承ください。
「意外と簡単!? .NETでOracle」シリーズが.NET開発者でオラクルを利用したい方のシステム構築の一助になれば幸いです。

  「意外と簡単!? .NETでOracle」シリーズは以下の3つの構成を予定しています

  1. スマートクライアント編
  2. Web アプリケーション編「ASP.NET」(本書)
  3. OO4O(Oracle Objects for OLE)からODP.NET移行編

  「意外と簡単!? .NETでOracleシリーズの「ASP.NET編」は、以下の9つの内容から構成しております

  1. ASP.NETでOracle Data Provider For .NETの使用
  2. サンプルアプリケーションのインストール
  3. ASP.NETからのLOBの扱い
  4. PROXY認証について
  5. ODP.NETとWebサーバーコントロールの連携
  6. ODP.NETのデバッグ・トレース機能の利用
  7. OracleErrorクラスによるエラーハンドリング
  8. 文キャッシングの利用
  9. グローバリゼーションのサポート

  「意外と簡単!? .NETでOracle」シリーズにおける開発環境

データベース・サーバー
OS:Microsoft Windows 2000 Professional + SP4
RDBMS:Oracle Database 10g Standard Edition for Windows
アプリケーション・サーバー
OS:Microsoft Windows 2003 Enterprise
APサーバー:Microsoft Internet Information Services 6.0
開発クライアント
OS:Microsoft Windows 2000 Professional + SP4
開発ツール:Microsoft Visual Studio .NET 2003



 ASP.NETでOracle Data Provider For .NETの使用

まず初めに、ASP.NETからOracle Data Provider for .NET(以下 ODP.NET)を使用する際に必要な設定について説明します。 IIS では ASP.NETスクリプトの実行時、ASPNETユーザーとして実行されます。 ASPNETユーザーがORACLE_HOMEディレクトリにアクセス権が無いと以下のようなエラーが発生しますのでアクセス権を設定する必要があります。


画面1 ORACLE_HOMEへのアクセス権が無いために発生するエラー画面

1.   Administrator 権限のあるユーザーで Windows にログオンする
2.   Windows の Explorer (Explorer.exe)を起動し、ORACLE_HOMEディレクトリを選択して右クリック


3.   「プロパティ」を選択し「セキュリティ」タブを開く


4.   「追加(D)」を押し「ユーザーまたはグループの選択」画面を表示する


5.   「場所」からローカルマシンを選択し、上記の「ASPNET」を選択し「追加(A)」を押し「OK」を押して追加する。
6.   5.で追加したユーザーを選択し、アクセス許可(P)より「許可」の列にある「読み取りと実行」のチェックをつけ「適用(A)」に続いて「OK」を押す。

以上の設定でIIS環境からODP.NETが使用可能になります。


 サンプルアプリケーションのインストール

サンプルアプリケーションは以下のサイトよりダウンロードできます。

http://otn.oracle.co.jp/easy/dotnet/index.html

ダウンロードファイル(sample.zip)を任意の一時フォルダに保存し、解凍してください。解凍しますと「data」、「StockManagement」、「WebServiceStockManagement」という3つのディレクトリが作成されます。 今回のサンプルアプリケーションでは以下のように データベース・サーバー、Webアプリケーション・サーバー、クライアントの3つの構成になります。 ダウンロードファイルを解凍後にそれぞれの端末で以下の作業を行ってください。


メモ:今回のサンプルを動作させるためにOracle Database 10gをインストールし、データベースを構築しておく必要があります。 Oracle Database 10gのインストール、初期データベースの作成などについては、OTN上の「意外と簡単!? Oracle Database 10g」をご参照下さい。
http://otn.oracle.co.jp/beginner/oracle10g/index.html

  サンプルデータ・パッケージの作成(データベース・サーバーでの設定)

今回のシステムで使用しているサンプルデータとパッケージをOracleがインストールされたデータベース・サーバー上にて、以下の手順で作成します。

1.   ディレクトリの設定
今回のサンプルアプリケーションでは商品マスタ上の商品イメージを画像ファイルとして管理しております。サンプルデータ作成時にビットマップファイルを取り込みます。そのためにビットマップファイルが保管されているディレクトリを読み込み可能に設定する必要があります。ダウンロードファイル(sample.zip)を解凍すると作成されるdataディレクトリをOracle Database 10gがインストールされているサーバー上の任意のディレクトリにコピーして以下のコマンドをSQL*Plus上で実行してください。
(dataディレクトリを c:\temp\dataにコピーし、ユーザーscottに対してディレクトリを読み込み可能にする設定のサンプル)
  • sqlplus system/<password>(SQL*Plusにsystemユーザーでログイン)
  • create directory imgdir as ‘c:\temp\data’;
  • grant read on directory imgdir to scott;

画面2 SQLPLUSでscottユーザーに対してディレクトリ設定を行った画面

メモ:create directoryにより、実際にディレクトリが作成されるわけではなく、Oracleで管理するためのディレクトリオブジェクトを作成しております。

2.   テーブルとサンプルデータのインストール
dataディレクトリのinstall.sqlをSQL*Plusで実行しますと、テーブルとパッケージが作成されます。以下のようにinstall.sqlを実行してください。
  • sqlplus scott/tiger (SQL*Plusにログイン)
  • @install.sql (テーブルとパッケージの作成スクリプトSQLの実行)
  • exit (SQL*Plusの終了)

画面3 scottユーザーでテーブル・パッケージ作成スクリプトを実行する画面

メモ:上記のサンプルでは SCOTTユーザーでログインしていますが、任意のユーザー名でログインしてください。また、1の作業で作成したディレクトリオブジェクトを削除したい場合は、SQL*Plusにsystemユーザーでログインしなおし、drop directory imgdir; と入力してください。


  Internet Information Services(IIS)の設定(アプリケーション・サーバー上での設定)

ダウンロードファイル(sample.zip)を解凍後に作成されるWebServiceStockManagementというディレクトリをWebサーバー上のInternet Information Services(IIS)のrootディレクトリ下にディレクトリごとコピーしてください。コピー後は以下のようなディレクトリ構成になります。


コピーが終わりましたら、「コントロール・パネル」の管理ツールより「インターネット・サービス・マネージャ」を起動してください。WebServiceStockManagementフォルダの設定を変更します。Internet Infomation Servies(IIS)の管理画面を開き、以下のようにWebServiceStockManagementフォルダを右クリックしてください。


メニューのプロパティを選択しますと、以下のプロパティ設定の画面が表示されます。


上記の画面で「アプリケーションの設定項目」にある「作成」ボタンをクリックするとアプリケーションの設定が行われます。作成されたら「OK」をクリックしてプロパティ・ウィンドウを終了してください。同様の作業をWebServiceStockManagementフォルダにも行ってください。


  Visual Studio .NETでソリューションを開く(開発クライアント上での設定)

Internet Information Services(IIS)の設定でStockManagementフォルダを公開設定したと思いますが、 そのフォルダ内にあるStockManagement.slnファイル(Visual Studio .NETのソリューションファイル)をダブルクリックでしますと、Visual Studio .NETが起動されます。 ソリューション・エクスプローラーには以下の2つのプロジェクトが開かれた状態になっております。


2つのプロジェクトはそれぞれ以下のような構成になっております。
  • StockManagement
    ASP.NET Webアプリケーション側 WebFormアプリケーション。
  • WebServiceStockManagement
    Webサービス側 XML Webサービスアプリケーション。
メモ:データアクセス部分はWebServiceStockManagementプロジェクトのServiceStockManagement.asmxに記述されています。

上記の設定で必要なファイルがインストールされ、実行可能になります。これから実際にODP.NETを使用したアプリケーション開発の方法をサンプル・アプリケーションのコードを参照しながら説明します。


 ASP.NETからのLOBの扱い

今回のサンプルアプリケーションでは、商品画像をOracleのバイナリデータを格納するための型、「BLOB型」として保存しています。実際に、ASP.NETからODP.NETを使用してBLOBフィールドを扱うための方法を説明します。

  LOBフィールドへの値の格納

画像ファイルをASP.NETのWEBフォームから選択させ、OracleのBLOB型フィールドへの格納は以下のようになります。

1.   ASPXファイルの<form>タグの修正。

ENCTYPE 属性では、送信されるデータの形式を指定します。ブラウザは ENCTYPE 属性を使用して、サーバーに送信される情報をエンコードします。このコードの action 属性によって、ページが要求を処理するように指定されます。

<ソース product.aspx - 「<form>タグ」指定部>

<form id="Form1" method="post" encType="multipart/form-data" runat="server">


2.   サーバーにアップロードするファイルを指定するためのInput コントロールを追加します。

<ソース product.aspx>

<INPUT id="FileImage" type="file" size="52" name="FileImage" runat="server">


3.   サーバーにアップロードされたファイルを変数に格納するための宣言と設定を行います。

<ソース product.aspx.vb ? 変数宣言部と、Page_Loadイベント部>


変数宣言部では、Postされた画像ファイルを格納するためのクラス、HttpPostedFileクラスを宣言しています。

Private myFile As HttpPostedFile

Page_Loadイベントで、Postされた値を変数に格納しています。

If Request.Files.Count > 0 Then
myFile = Request.Files(0)
End If


4.   Postされた画像ファイルをByte変数に格納し、WEBサービスに引数として渡します。

<ソース product.aspx.vb ? UpdateProductDataメソッド>

'// 画像ファイルの格納
Dim FileLen As Integer = myFile.ContentLength Dim imgByte(FileLen) As Byte

' Initialize the stream.
Dim MyStream As System.IO.Stream = myFile.InputStream

' Read the file into the byte array.
MyStream.Read(imgByte, 0, FileLen)

'// XML WEB サービス側で商品情報を更新
Dim wSvc As New ws_sman.ServiceStockManagement
Try
     wSvc.UpdateProductData(TextBoxProductCode.Text, _
           TextBoxProductName.Text, _
           CInt(TextBoxPrice.Text), _
           CInt(TextBoxStockNum.Text), _
           TextBoxUnit.Text, _
           TextBoxRemarks.Text, _
           TextBoxSupplierCode.Text, _
           CInt(TextBoxPurchasePrice.Text), _
           CInt(TextBoxOrderPoint.Text), _
           imgByte)

〜 以下省略 〜

5.   WEBサービス側でByte配列からBLOBフィールドへの格納

WEBサービス側でイメージファイルをByte配列として受信し、BLOBフィールドへ更新を行います。

<ソース ServiceStockManager.asmx.vb - UpdateProductDataメソッド>

<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Public Sub UpdateProductData(ByVal sProductCode As String, _
     〜 省略 〜
     ByVal byteImage() As Byte)

     Dim prm(10) As OracleParameter

     DbOpen()
     sSql = "begin " & _
           〜 省略 〜
           "pkg_product.ProductRec.productimage := :productimage; " & _
           "pkg_product.UpdateProductData; " & _
           "end; "
     cmd.CommandText = sSql
     〜 省略 〜
     prm(9) = cmd.Parameters.Add("productimage", byteImage)
     prm(9).OracleDbType = OracleDbType.Blob
     cmd.ExecuteNonQuery()

     cnn.Close()
End Sub

  LOBフィールドから値を取得

BLOBフィールドから画像データを取得し、ASP.NETのWEBフォームで表示する方法について説明します。

1.   WEBサービス側で商品情報をDataSetオブジェクトに格納

<ソース ServiceStockManager.asmx.vb - GetProductDataメソッド>

sSql = "select prod.productcode," & _
     〜 省略 〜
     "prod.productimage " & _
      "from " & _
      "product prod, supplier suppli " & _
     "where " & _
      "prod.suppliercode = suppli.suppliercode and " & _
      "prod.productcode = :ProductCode"
cmd.CommandText = sSql
Dim pProductCode As OracleParameter = _
      cmd.Parameters.Add("ProductCode", sProductCode)
Dim da As New OracleDataAdapter(cmd)
If dsData.Tables.Contains("ProductData") Then dsData.Tables("ProductData").Clear()da.Fill(dsData, "ProductData")

2.   ASP.NETのWEBフォーム上でDataSetオブジェクトの画像データを表示

<ソース ServiceStockManager.asmx.vb - UpdateProductDataメソッド>

Dim wSvc As New ws_sman.ServiceStockManagement
Dim dsProductData As New DataSet

Try
     wSvc.GetProductData(Request.QueryString("productcode"), dsProductData)

      '//パラメータの設定
      Dim byteImg() As Byte = _
            dsProductData.Tables("ProductData").Rows(0).Item("productimage")
      Response.ContentType = "image/pjpeg"
      Response.BinaryWrite(byteImg)
      Response.End()
Catch ex As Exception
      'MessageBox.Show(ex.Message)
Finally
     wSvc.Dispose()
End Try



 ASP.NETアプリケーションのセキュリティについて

今回のサンプルアプリケーションでは、ユーザー認証に ASP.NETのForms認証を行っております。(ASP.NETのForms認証についての詳細については、Microsoft社のサイトを参照してください。)認証によるセキュリティの確保以外にも、どのユーザーがどのような操作を行ったかを監査したい場合もあると思います。その場合、ASP.NETもしくは、XML WEB サービスを利用した3層アプリケーションでは、普通であれば、中間層から共通のユーザーでデータベースへ接続しますが、その場合、個々のユーザー毎でのデータベースのアクセス制御や監査は行えないと思います。3層アプリケーションで監査を実行するにはプロキシ認証を行う方法と、アプリケーション・コンテキストの利用する方法があります。

  プロキシ認証

  プロキシ認証を利用すると、接続のためのユーザーは共有するが、データベースのアクセス権限等は、個々のユーザー毎で実施することが可能になります。

画面1 PROXY認証での接続例

プロキシ認証の設定は、OracleConnectionクラスのConnectionプロパティで設定します。

<ソース ServiceStockManager.asmx.vb - UpdateProductDataメソッド>

Dim cnn As New OracleConnection

cnn.ConnectionString = _
      "User Id=scott;Password=tiger;Data Source=orcl;" + _
      "Proxy User Id=staffuser;Proxy Password=staffpassword"
cnn.Open()


     プロキシ認証を利用した接続

プロキシ認証を行うことによりデータベースの権限をアプリケーションで享受可能になります。その結果プロキシ認証で指定したユーザーでなければデータへのアクセス権限がないので、より安全な接続環境を実現できます。また、DBユーザー毎に監査を行うことが可能になります。Oracleのセキュリティに関する情報は、OTN(Oracle Technology Network)の「Documentation Library」にて詳細な手順を説明していますのでそちらを参照してください。今回のサンプルではstaffユーザーでアクセスする際に、OracleのエラーがそのままWEBフォーム上に表示されてしまいましたが、実際のアプリケーションではエラー情報を取得して適切に対処する必要があります。その場合は、OracleException クラスを利用します。OracleExceptionを利用したエラーハンドリングは後述しますが、詳細はOTNの「Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらをご覧下さい。


  クライアント識別子の利用

クライアント識別子を使用することにより、以下のことが可能になります。
  • 同一DBユーザーでセッション毎に異なるアクセス権を設定可能
  • SYSTEMユーザーや表の持主のアクセスも制御可

アプリケーション・コンテキストを使用すると、セッション毎に固有の属性値を格納できます。

画面2 セッション毎に固有の属性値を格納

今回のサンプルアプリケーションでは、得意先マスタの検索時にどのユーザーが検索を行ったかを監査できるように、クライアント識別子を設定しています。クライアント識別子の設定は、exec DBMS_SESSION.SET_IDENTIFER('ユーザー名');
上記のSQLを実行すると、監査用テーブル dba_audit_trail の CLIENT_ID列に値が設定されます
<ソース ServiceStockManagement.asmx- GetCustomerListAuditメソッド>

cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "DBMS_SESSION.SET_IDENTIFIER"
cmd.Parameters.Add(New OracleParameter("pUserId", sUserId))
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()

セッション識別子にユーザーの属性を設定すると、監査ログのCLIENT_IDにクライアント識別子が設定されます。


上記のように監査以外にも、Oracle 10g Enterprise Editionではファイングレイン・アクセスコントロールにより、アプリケーションを修正せずに、Oracle Database上の設定で、データアクセスの制御を行えます。


図3 ファイングレイン・アクセスコントロールによるデータアクセス制御


メモ:ファイングレインアクセスコントロールの具体的な実装例などはマニュアルをご覧ください。
「Oracle 8i アプリケーション開発者ガイド 基礎編」 P11-53(8.1.7の場合)
「Oracle 9i アプリケーション開発者ガイド 基礎編」 P12-15(9.2.0の場合)
「Oracle Databaseセキュリティガイド 10gリリース1」 P14-7
マニュアルはOTNよりダウンロード可能です
http://otn.oracle.co.jp/document/index.html



 ODP.NETでのエラーハンドリング

OracleExceptionクラスは、Oracle Data Provider for .NETでエラーが発生した場合にスローされる例外を表します。各OracleExceptionオブジェクトには、エラーまたは警告を説明するErrorプロパティのOracleErrorオブジェクトが1つ以上含まれています。OracleExceptionのエラーハンドリングを実装したコードは以下のようになります。

<ソース ServiceStockManagement.asmx- UpdateOrderDataメソッド>

Try
      cmd.ExecuteNonQuery()
      retVal = prm(6).Value
Catch ex As OracleException
      WriteEventLog(ex)
      retVal = 0
      ContextUtil.SetAbort()
End Try


上記のコードではWriteEventLogというメソッドをコールし、エラーの内容をイベントログに出力しています。WriteEventLogのコードは以下のようになります。

<ソース ServiceStockManagement.asmx- WriteEventLogメソッド>

Private Sub WriteEventLog(ByVal ex As OracleException)
     Dim appLog As EventLog = New EventLog("Application")

     appLog.Source = "StockManagement"
     appLog.WriteEntry(ex.Message, EventLogEntryType.Error)

    appLog.Close()
    appLog.Dispose()
End Sub

以上のWriteEventLogメソッドをでは、Windowsのイベントビューアー上にエラーの内容を追記しております。「appLog.Source = "StockManagement"」の部分で、イベントビューアーに表示されるソースになります。

画面4 イベントビューアー上でのエラーの確認


ASPNETユーザーはイベントログにイベントソースを作成するための適切なユーザー権限を持っていないので、以下の手順でレジストリエディタを使用し、Applicationイベントログの下にイベントソースを作成します。

1.   ASPNETユーザーはイベントログにイベントソースを作成するための適切なユーザー権限を持っていないので、以下の手順でレジストリエディタを使用し、Applicationイベントログの下にイベントソースを作成します。
2.   [名前] ボックスに regedit と入力します。
3.   次のレジストリ サブキーに移動します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
4.   Application サブキーを右クリックし、[新規] をポイントして、[キー] をクリックします。
5.   キー名として StockManagement と入力します。 (この値はEventLogオブジェクトのSourceプロパティで設定する、イベントビューアーに表示されるソースの値になります。)
6.   レジストリ エディタを閉じます。


OracleExceptionで提供される、メンバー/メソッド/プロパティの一覧は、OTNの「 Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらをご覧下さい。



 ODP.NETとWebサーバーコントロールの連携

ASP.NETでは多数のWebサーバーコントロールが用意されています。Visual Studio.NETを使用して、ASP.NET Webアプリケーションを開発する際には、Webフォーム上にツールボックスからコントロールを配置します。Webサーバー上で実行されるコードは、配置された各コントロールのプロパティにアクセスして処理を行うことができます。実際にODP.NETとWebサーバーコントロールの連携方法について説明します。

  型付データセットの作成

型付データセットとはテーブル名や列名などの定義情報を事前に取り込むことにより作成されるデータセットになります。データバインドを利用して、Webサーバーコントロールと連携することにより以下のメリットがあります。
  • コードの可読性の向上
  • コードの信頼性の向上
例えば、通常のデータセットを利用した場合と型付データセットを利用した場合のコードは以下のようになります。

型なしデータセットを使用した場合

Dim strCustomerId = dsCustomer.Tables("MSTCUSTOMER").Rows(5).Item("CUSTOMERID")
If (dsCustomer.Tables("MSTCUSTOMER").Rows(5).Item("CUSTOMERID") Is DBNull.Value) Then
      'Null時の処理を記述
End If

型付データセットを使用した場合

Dim strCustomerId = dsCustomer.MSTCUSTOMER(5).CUSTOMERID
If (dsCustomer.MSTCUSTOMER(5).IsADDRESSNull) Then
      'Null時の処理を記述
End If


上記サンプルコードのようにソースの可読性がよくなるだけでなく、インテリセンスによるコード補完も行われるため、コーディングミスも軽減されます。また、コンパイル時の名前チェックを有効化したりすることも可能です。では、実際にOracleで管理されているテーブル情報をもとに型付データセットを作成してみましょう。

1.   サーバーエクスプローラより「データ接続」を右クリックし、「接続の追加」をクリック

2.   データリンクプロパティが表示されるので、「Microsoft OLE DB Provider for Oracle」を選択し、「次へ」ボタンをクリック

3.   サーバー名にネットサービス名を入力。ユーザー名とパスワードはOracleユーザーとパスワードを入力。また、「パスワードを保存する」チェックボックスにチェックを入れておくと、接続の度にログインダイアログが出ないので、チェックをしていただくことをお勧めします。

4.   3.の「接続のテスト」を実行し、接続の確認後に「OK」ボタンをクリックしてデータリンクプロパティを閉じてください。サーバーエクスプローラのデータ接続に設定後の接続が追加されているのが確認できます。

5.   ソリューションエクスプローラよりプロジェクトを右クリックし、「追加」−>「新しい項目の追加」を選択してください。

6.   新しい項目の追加ウィンドウでデータセットを選択し、任意のファイル名を入力して「開く」ボタンをクリックしてください。

7.   データセットのデザイン画面が開きますので、サーバーエクスプローラより型付データセットを作成したい対象のテーブルを選択して、ドラッグアンドドロップでデザイン画面に貼り付けてください。

8.   「ファイル」メニューより作成されたデータセット(xsdファイル)を保存すると型付データセットが作成されます。


9.   作成された型付データセットはクラスとして作成されます。VB.NETから型付データセットを利用するには、以下のように型付データセットのインスタンスを生成します。
型付データセットのインスタンスを生成

Dim dsCustomer As New CustomerDataset


  Webサーバーコントロールの連携

Oracleデータベースからデータを取得し、Webサーバーコントロールと連携する方法として、Datasetオブジェクトを使用します。Oracleデータベースの値を一度Datasetオブジェクトに格納して、データバインディング機能を使用して、Webサーバーコントロールに結果を表示します。

先ほど作成した型付データセットを利用して、DatasetとWebサーバーコントロールの連携方法を説明します。
1.   WEBフォームの設定
ASP.NETのWEBフォーム上に以下のコントロールを貼り付けます。
  • OracleConnection
  • OracleCommand
  • OracleDataAdapter
  • DataSet
  • DataGrid
OracleExceptionで提供される、メンバー/メソッド/プロパティの一覧は、OTNの「 Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらをご覧下さい。


2.   コントロールのプロパティの値を設定

Webフォーム上に貼り付けたコントロールに対してプロパティの値を以下のように設定します。

コントロール コントロール名 プロパティ 設定値
OracleConnection OracleConnection1 ConnectionString User Id=scott;Password=tiger;Data Source=orcl(orclの部分はサービス名を指定してください。)
OracleCommand OracleCommand1 Connection OracleConnection1を指定
OracleDataAdapter OracleDataAdapter1 SelectCommand OracleCommand1を指定
CustomerDataset CustomerDataset1 変更なし 変更なし
DataGrid DataGrid1 変更なし 変更なし

表2 ODP.NETで提供されているオブジェクト一覧


上記のコントロールをWebフォーム上に貼り付ける際に、DataSetコントロールをWebフォームに貼り付けると、以下の「データセットの追加」ウィンドウが表示されます。この時に、「型指定されたデータセット」を選択し、既に作成された型付データセットをしていします。

3.   Page_Loadイベントにコードを記述
Page_Loadイベントに以下のコードを記述します。

データバインドを使用してDataGridへemp表を表示するサンプルコード(VB.NET)

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     OracleCommand1.CommandText = "select * from mstcustomer order by customerid"
     OracleDataAdapter1.Fill(CustomerDataSet1, "CustomerList1")
     DataGrid1.DataSource = CustomerDataSet1
     DataGrid1.DataMember = " CustomerList1"
     DataBind()

End Sub

4.   以上のコードを実行すると、テーブルの内容がDataGridコントロールに表示されます。




 ODP.NETのデバッグ・トレース機能の利用

ODP.NETでは、すべてのODP.NETアクティビティをトレース・ファイルにロギングできるデバッグ・トレースがサポートされています。ASP.NETのようなWebアプリケーションでは複数のユーザーがコネクションプールを利用して同一コネクションからSQLを発行するような場面が多いと思います。そのような場合、コネクションプールの状況をトレース・ファイルで確認が取れます。様々なレベルのトレースが可能で、トレースレベルの設定はレジストリで行います。

  デバック・トレースのためのレジストリ設定

レジストリ設定は、次のディレクトリの下に構成してください。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID\ODP.NET\HOME HOMEID
は該当するOracleホーム・ディレクトリです。



 トレースレベルの設定

上記のレジストリ設定のTraceLevelを設定することによりさまざまなレベルのトレース情報を取得することが可能です。

トレースレベル 説明
0 なし
1 入力、出力およびSQL実行情報
2 接続プーリング統計
4 分散トランザクション(登録および登録解除)

複数のオブジェクトについてのトレースを取得するには、有効な値を追加するだけです。たとえば、TraceLevelが3に設定されている場合、トレース情報は入力、出力、SQLおよび接続プーリング情報についてロギングされます。


 トレースオプションの設定

TraceOptionの有効な値は、次のとおりです。

トレースオプション 説明
0 1つのトレース・ファイル
1 複数のトレース・ファイル

TraceOptionは、トレース情報を1つのファイルに記録するか、スレッドIDごとの複数のファイルに記録するかを指定します。単一トレース・ファイルを指定した場合は、TraceFileNameに指定されたファイル名が使用されます。複数のトレース・ファイル・オプションを要求した場合、スレッドごとにトレース・ファイルを作成するために、指定されているファイル名にスレッドIDが追加されます。



 文キャッシングについて

ASP.NETなどのWEBアプリケーションでは、通常は、アプリケーション・サーバー等の中間層からデータベースへのアクセスを共有します。その場合、文キャッシングを利用することにより、同一のコネクションで発行される同じSQLもしくはPL/SQL文を後で実行した際、カーソルから解析された情報を再利用して実行することでパフォーマンスが向上します。文キャッシングを有効にするためには接続文字列属性に 「Statement Cache Size」を指定することにより可能になります。「Statement Cache Size」で指定する値は、実際にキャッシュする文の最大数を指定します。以下の接続文字列属性では最大200個の文をキャッシュする設定を行っております。

<ソース ServiceStockManagement.asmx- DbConnectメソッド>

cnn.ConnectionString = _
     "user id=scott;password=tiger;data source=orcl;Statement Cache Size=200"

デフォルトでは、この属性は0に設定され、文キャッシングは無効です。指定された最大キャッシュ・サイズまで文がキャッシュされると、使用頻度のもっとも低い文が解放され、新しく作成された文をキャッシュするためのスペースが確保されます。キャッシュされた文を全て消去するためには、OracleConnectionのPurgeStatementCacheメソッド をコールします。また、文キャッシュを有効にするためには、SQL文またはPL/SQL文はリテラル値ではなくパラメータを使用する必要があります。例えばテキストボックスの値をパラメータとして設定しているコードは以下のようになります。

パラメータを使用することにより文キャッシュが有効になるコード (VB.NET)

Dim cmd As New OracleCommand

cmd.CommandText = "Select * from emp where ename like :ename"

Dim paraEname As OracleParameter = cmd.Parameters.Add("ename",
TextboxEname.Text + "%")

以下のコードようにリテラル値でSQLまたはPL/SQL文を指定すると文キャッシュが有効になりません。

文キャッシュが有効にならないコード (VB.NET)

Dim cmd As New OracleCommand

cmd.CommandText = "Select * from emp where ename like '" +
TextboxEname.Text + "%'"


最新のODP.NETのダウンロードは、 OTNのホームページ から、「ソフトウェアダウンロード」のリンクを選択し、「テクノロジ/ユーティリティ/ドライバ」の欄から、「Oracle Data Provider for .NET(ODP.NET)」のリンクをクリックしてください。 また、文キャッシングについてはOTNのOTNの「 Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらをご覧下さい。


 グローバリゼーションのサポート

最近のWebアプリケーションは、国内の使用のみならず複数の国をまたがったユーザーの使用も多くなってきています。ODP.NETのグローバリゼーション・サポートによって、アプリケーションで、文化によって異なるデータを適切に操作できます。この機能を使用すると、Oracleグローバリゼーション設定に従って適切な文字列フォーマット、日付、時刻、通貨、数値、ソート順序およびカレンダ規則が適用されます。

 グローバリゼーションの種類

ODP.NETでは以下の3種類のグローバリゼーションをサポートします。
  • クライアント・グローバリゼーション
  • セッション・グローバリゼーション
  • スレッドベースのグローバリゼーション
  • クライアント・グローバリゼーション
    クライアント・グローバリゼーション設定は、ローカル・コンピュータのWindowsレジストリ内のOracleグローバリゼーション設定(NLS_ANG)から導出されます。 クライアント・グローバリゼーション・パラメータ設定は読取り専用であり、アプリケーションの存続期間中は変わりません。クライアント・グローバリゼーション設定は、OracleGlobalization.GetClientInfoメソッドをコールすることにより取得できます。次のサンプルコードでは、クライアント・グローバリゼーション設定を取得しています。

    Dim ClientGlob OracleGlobalization = OracleGlobalization.GetClientInfo()

  • セッション・グローバリゼーション
    セッション・グローバリゼーション・パラメータは、最初はクライアント・グローバリゼーション設定と同じです。クライアント設定とは異なり、セッション・グローバリゼーション設定は更新可能です。ただし、セッション・グローバリゼーション設定はデータベース・サーバーへの接続を確立した後でしか取得できません。セッション・グローバリゼーション設定は、OracleConnectionのGetSessionInfo()をコールすることにより取得できます。このメソッドをコールすると、セッションのグローバリゼーション設定を表すプロパティを持つOracleGlobalizationオブジェクトのインスタンスが返されます。 OracleConnectionオブジェクトにより、接続が確立されるときに、クライアント・コンピュータのOracleグローバリゼーション(またはNational Language Support(NLS))レジストリ設定で指定されている値で初期化されたグローバリゼーション・パラメータを持つセッションが暗黙的にオープンされま。セッションの設定は更新可能であり、その存続期間中も変更できます。 次のサンプルコードでは、セッションの日付書式設定を変更します。

    Dim cnn As New OracleConnection("user id=scott;password=tiger;data source=orcl")
    Dim cmd As New OracleCommandcmd.Connection = cnn
    cnn.Open()
    Dim info As OracleGlobalization = cnn.GetSessionInfo
    info.DateFormat = "yyyy/mm/dd"
    cnn.SetSessionInfo(info)

  • セッション・グローバリゼーション
    セッション・グローバリゼーション・パラメータは、最初はクライアント・グローバリゼーション設定と同じです。クライアント設定とは異なり、セッション・グローバリゼーション設定は更新可能です。ただし、セッション・グローバリゼーション設定はデータベース・サーバーへの接続を確立した後でしか取得できません。セッション・グローバリゼーション設定は、OracleConnectionのGetSessionInfo()をコールすることにより取得できます。このメソッドをコールすると、セッションのグローバリゼーション設定を表すプロパティを持つOracleGlobalizationオブジェクトのインスタンスが返されます。 OracleConnectionオブジェクトにより、接続が確立されるときに、クライアント・コンピュータのOracleグローバリゼーション(またはNational Language Support(NLS))レジストリ設定で指定されている値で初期化されたグローバリゼーション・パラメータを持つセッションが暗黙的にオープンされま。セッションの設定は更新可能であり、その存続期間中も変更できます。 次のサンプルコードでは、セッションの日付書式設定を変更します。
    System.Threading.Thread.CurrentThread.CurrentCultureが変更されても、 スレッドまたはセッションのOracleGlobalizationの設定に影響はありません。またその逆も同様です。

    次のコードは、ODP.NET型によってスレッドのグローバリゼーション設定がどのように使用されるかを示しています。

    Dim ThreadGlob As OracleGlobalization = OracleGlobalization.GetThreadInfo()
    ThreadGlob.DateFormat = "YYYY-MM-DD"
    OracleGlobalization.SetThreadInfo(ThreadGlob)
    Dim OraDate As OracleDate = New OracleDate("2002-01-01")

    OracleGlobalizationオブジェクトでは、そのプロパティに対して行われた変更が検証されます。プロパティの設定に無効な値が使用されている場合、例外がスローされます。TerritoryおよびLanguageプロパティが変更されると、OracleGlobalizationオブジェクトの他のプロパティが暗黙的に変更されますので注意してください。

 グローバリゼーションの影響を受ける操作

この項では、グローバリゼーション設定に依存する、またはこの設定の影響を受けるODP.NET型および操作をリストします。
  • クライアント・コンピュータのグローバリゼーション設定に依存する操作
    OracleString構造体は、クライアント・コンピュータのOracleGlobalization設定によって決まります。GetNonUnicodeメソッドでUnicode文字列をbyte[]に変換する場合、およびbyte[]を受け入れるOracleStringコンストラクタでANSI文字のbyte[]をUnicodeに変換する場合、ローカル・コンピュータのクライアント・キャラクタ・セットが使用されます。
  • スレッド・グローバリゼーション設定に依存する操作
    OracleString構造体は、クライアント・コンピュータのOracleGlobalization設定によって決まります。GetNonUnicodeメソッドでUnicode文字列をbyte[]に変換する場合、およびbyte[]を受け入れるOracleStringコンストラクタでANSI文字のbyte[]をUnicodeに変換する場合、ローカル・コンピュータのクライアント・キャラクタ・セットが使用されます。
  • セッション・グローバリゼーション・パラメータの影響を受ける操作
    セッション・グローバリゼーション設定は、文字列としてサーバーから取得される、またはサーバーに送信されるすべてのデータに影響を与えます。 たとえば、TO_CHAR()関数が適用されたDATE列が選択されている場合、DATE列のデータは、セッション・グローバリゼーション設定のDateFormatで指定された日付書式の文字列になります。逆の方向にデータを送信するには、DATE列に挿入する文字列データを、セッション・グローバリゼーション設定のDateFormatプロパティで指定された書式にする必要があります。 また、セッション・グローバリゼーション設定は、安全な型マッピングを使用して文字列としてDataSet内に取得されるデータにも影響を与えます。型の書式が区別される場合、文字列は常に、セッション・グローバリゼーション設定で指定されている書式になります。 たとえば、VARCHAR2およびCHARデータは、適用可能な書式がないため、セッション設定の影響を受けません。しかし、DateFormatおよびNumericCharactersプロパティは、DATE型とNUMBER型が安全な型マッピングを使用してデータベース・サーバーから文字列として取得された場合、それぞれの文字列表現に影響を与える可能性があります。