はじめてのODP.NETアプリケーション開発

第1回:Oracle Data Provider for .NET ファーストステップ・ガイド

日本オラクル サポートサービス本部
システム製品サポート2部 ツールグループ
八坂 和男


◆ はじめに

2003年1月29日より、Oracle Data Provider for .NET (以下ODP.NET)が日本でサポートされることとなりました。この連載ではODP.NET を使用したアプリケーション開発について具体例を交えて紹介します。今回は初めてODP.NET を使用する方を対象としたファーストステップ・ガイドです。ODP.NETの概要やインストール上の注意点の説明、さらにC# コマンドライン・コンパイラを使用した簡単なサンプルの実行まで行います。


◆ ODP.NETとは

ODP.NET はMicrosoft .NET 環境からOracle データベースへネイティブに接続可能なドライバ・ソフトウェアです。

Microsoft .NET 環境ではOLE DB やODBC といった従来のドライバ・ソフトウェアを.NET 環境で使用するために、データ・アクセス・ブリッジとしてOLE DB .NET やODBC .NET というインターフェースを用意しています。しかしこれらを使用した場合一階層余計に通過するため必然的にオーバーヘッドが発生します。ODP.NET はデータ・アクセス・ブリッジを経由しないネイティブ設計なので、効率的かつ高機能なデータベース接続を提供します。

主なODP.NET の機能は以下のとおりです。
  • ADO.NET 仕様に準拠
  • PL/SQL のサポート
  • ネイティブOracle データタイプのサポート
    (LOB型、REF カーソル、BFILE 型、N データ型、DATE 型、TIMESTAMP型、LONG型、RAW型)
  • 分散トランザクションのサポート
  • 接続プーリング
  • Unicode サポート
  • 透過的アプリケーション・フェイルオーバー(TAF)のサポート
  • XML 機能のサポート
       サーバーサイドではXML DB(9.2.0.2 以降の予定)
       クライアントサイドでは.NET 環境のクラスSystem.XML を使用
  • .NET 言語(VB.NET,C#)のサポート

以下の図は.NET 環境から各ドライバ・ソフトウェアをとおしてOracle データベースへと接続する際のイメージ図です。



◆ システム要件

Oracle Data Provider for .NET (9.2.0.2.0) (ODP.NET)をご使用になるには以下の要件を満たす必要があります。

  • 対応オペレーティングシステム
    Windows 98, Windows NT 4.0, Windows 2000, Windows XP Professional (32-bit)

  • 接続先データベース
    Oracle8 R8.0.6以降(各プラットフォーム)

  • クライアント環境
    Oracle クライアント9.2.0
    Oracle Net 9.2.0
    Microsoft .NET Framework
    Microsoft Transaction Serverとの統合には、Oracle Services for Microsoft Transaction Server (9.2.0)が必要です。

なお、Windows Server 2003 (旧称.NET Server)環境では現在サポートしておりませんが、今後のバージョンにてサポート予定となっております。


◆ インストール

OTN(http://otn.oracle.co.jp/)よりダウンロードして上記システム要件のPC へとインストールします。

  1. ODPNET92020.exe を一時ディレクトリ(例 c:\odpnet)にコピーします。

  2. 同梱のファイルを解凍するためにODPNET92020.exe を実行します。

  3. 解凍された\Disk1\install\win32\setup.exe を実行してOracle Universal Installer を起動し、インストールを始めます。

  4. インストラクションに従ってインストールを終えたら、一時ディレクトリおよびODPNET92020.exe や解凍したインストール・ファイルを削除します。

  5. Windows 98をお使いの方は、ODP.NET のインストールメニューの終了後にOSの再起動が必要です。

注意: 一時ディレクトリの名前に"Tmp" は使わないようにしてください。


複数のOracle ホームが同一コンピュータ上に存在する場合(例えば、Oracle8i クライアントとOracle9i リリース2 クライアントがインストールされている場合)インストール先としてOracle9i リリース2 クライアントのOracle ホームを選択してください。


アプリケーション実行時の注意点
複数のOracleホームが同一コンピュータ上に存在する場合(例えば、Oracle8iクライアントとOracle9i リリース2クライアントなど)、Oracle Home Selector でOracle9i リリース2クライアントを選択してください。
Oracle Home Selector は、環境変数PATH を編集して適切なOracle ホーム・ディレクトリをプライマリ・ホームにできる、Windows版Oracle9i Databaseに付属するGUI のツールです。このツールは、1 台のコンピュータに、アクティブなOracle ホーム・ディレクトリが複数ある場合にのみ使用できます。
Oracle Home Selector を起動するには、「スタート」→「プログラム」→「Oracle Installation Products」→「Home Selector」を選択します。


ドキュメント(英語版)の閲覧
ODP.NET のドキュメント(英語版)はORACLE_HOME\odp.net\doc ディレクトリにインストールされます。オンラインでPDF文書を閲覧するにはORACLE_HOME\odp.net\doc ディレクトリにあるodpnet.pdfファイルを開いてください。
また、ODP.NET の日本語ドキュメントが以下のサイトからダウンロードできるようになりました。こちらは上記英語版PDF ドキュメントの日本語翻訳版となっています。

Oracle Data Provider for .NET 開発者ガイドリリース9.2.0.2 (J07306-01)
http://otn.oracle.co.jp/document/products/oracle9i/920/windows.html


◆ ODP.NETの動作確認

ODP.NET の動作確認を行います。ODP.NET はC# やVB.NET といった.NET 開発環境の言語を使用して記述することができます。以下の動作確認サンプルはC# を使用しています。.NET 開発環境としてVisual Studio .NET 開発環境がインストールされると同時に.NET Framework SDK もインストールされ同時にコマンドライン・コンパイラがインストールされます。今回はこちらを使用したコンパイルを行います。


1. コマンドライン・コンパイラの設定
C# コマンドライン・コンパイラはcsc コマンドで起動します。コマンドプロンプトを起動してcsc と入力しても以下のメッセージが出力された場合はcsc コマンドへの存在するディレクトリが環境変数PATH に設定されていない状態です。

C:\>csc
'csc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。

このエラーが発生する場合は以下のバッチファイルを実行します。
"C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin\corvars.bat"

なお、上記はデフォルトでインストールした場合のディレクトリになりますので、ファイルの位置が異なる場合があります。corvars.bat ファイルをご利用の環境で検索し実行してください。

正常に設定できると以下のようにC# コンパイラの起動が確認できます。

C:\>csc
Microsoft (R) Visual C# .NET Compiler version 7.00.9466
for Microsoft (R) .NET Framework version 1.0.3705
Copyright (C) Microsoft Corporation 2001. All rights reserved.

fatal error CS2008: 入力が指定されていません。


2. C# ソースの準備
コンパイラ環境が整ったら作業用ディレクトリに移動し、以下のソースコードをテキスト・エディタで記述して保存します。こちらはC# で記述したソースコードなのでここではExample.cs とします。このように拡張子に.cs を付けてC# ソースであることを明示します。

このプログラムではODP.NET を使用してSCOTT ユーザーでTNS接続文字列ExampleDB のデータベースへ接続し、接続先データベースのバージョンを取得します。適宜TNS接続文字列などをお使いの環境にあわせて修正してください。

// Example.cs
//


using System;
using Oracle.DataAccess.Client;

class Example
{
  OracleConnection con;

  void Connect()
  {
    con = new OracleConnection();
    con.ConnectionString = "User Id=scott;Password=tiger;Data Source=ExampleDB";
    con.Open();
    Console.WriteLine("Connected to Oracle");
    Console.WriteLine(con.ServerVersion);
  }

  void Close()
  {
    con.Close();
    con.Dispose();
  }

  static void Main()
  {
    Example example = new Example();
    example.Connect();
    example.Close();
  }
}


3. コンパイル
ODP.NET のクラスはOracle.DataAccess.Client 名前空間にて提供されています。このクラス・ライブラリを使用するため、%ORACLE_HOME%\bin\Oracle.DataAccess.dll を参照設定します。コマンドライン・コンパイラでは/r: にて参照設定を行います。

Example.cs のコンパイルは以下のように行います。

>csc /r:C:\oracle\ora920\bin\Oracle.DataAccess.dll Example.cs

Microsoft (R) Visual C# .NET Compiler version 7.00.9466
for Microsoft (R) .NET Framework version 1.0.3705
Copyright (C) Microsoft Corporation 2001. All rights reserved.

この/r: Oracle.DataAccess.dll で設定する参照設定がない場合には以下のエラーが発生します。

>csc Example.cs
Microsoft (R) Visual C# .NET Compiler version 7.00.9466
for Microsoft (R) .NET Framework version 1.0.3705
Copyright (C) Microsoft Corporation 2001. All rights reserved.

Example.cs(2,7): error CS0246: 型または名前空間名'Oracle' が見つかりませんでした。
         ディレクティブを使うかアセンブリ参照を使ってください。
Example.cs(6,3): error CS0246: 型または名前空間名'OracleConnection' が見つかりませんでした。
         ディレクティブを使うかアセンブリ参照を使ってください。

このエラーは.NET 開発環境で使用するクラスから'Oracle'という名前空間が見つからなかったこと、さらに'OracleConnection'という型定義を解決できなかったことを示します。


4. 実行
コンパイルが正常に終了すると、Example.exe ができていますのでそちらを実行します。今回のサンプルでは、特にエラー処理を行っていないコンソール・アプリケーションですので、エラーが発生するとコンソールにエラー出力をして終了します。Visual Studio .NET 開発環境等がインストールされている場合にはデバッガによるデバッグをするかどうかたずねるダイアログが表示され、そちらをキャンセル後コンソールにエラーが出力されます。以下に発生しやすい2種類のエラー出力を掲載しました。(読みやすくするため、改行位置を修正しています。)

エラーサンプル1
TNS 接続文字列(サンプルソースではExampleDB)がTNSNAMES.ORA に無い場合のエラー

> example

ハンドルされていない例外: Oracle.DataAccess.Client.OracleException
ORA-12154: TNS: サービス名を解決できませんでした。
 at Oracle.DataAccess.Client.OracleException.HandleErrorHelper
    (Int32 errCode, OracleConnection conn, IntPtr opsErrCtx,IntPtr opsSqlCtx, Object src, String procedure, String[] args)
 at Oracle.DataAccess.Client.OracleConnection.Open()
 at Example.Connect()
 at Example.Main()

エラーサンプル2
環境変数 PATH が ODP.NET のインストールされている %ORACLE_HOME%\bin を最初に参照していない場合のエラー

> example
ハンドルされていない例外: System.DllNotFoundException: DLL (OraOps9.dll) を読み込めません。

 at Oracle.DataAccess.Client.OpsTrace.GetRegTraceInfo(UInt32& TrcLevel)
 at Oracle.DataAccess.Client.OracleConnection..ctor()
 at Example.Connect()
 at Example.Main()

エラーなく実行されると以下のように出力されます。(例: 9.2.0.1.0データベースへ接続した出力)

> example
Connected to Oracle
9.2.0.1.0


今回はここまでです。
次回は ADO.NET を使用したデータベース操作について説明します。