net環境における oracle...

44
.NET環境における Oracle DBの活用 日本オラクル株式会社 本資料では、.NET環境からOracle RDBMSにネイティブに接続するためのミドルウェアであるOracle Data Provider for .NETに関して説明しています。 ==================== 改訂記録 ==================== 20033月 初版 20047月第2P.43のサンプルコードの「接続クラスのインスタンス化」の部分を訂正 1

Upload: others

Post on 06-Jan-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

.NET環境における      Oracle DBの活用

日本オラクル株式会社

本資料では、.NET環境からOracle RDBMSにネイティブに接続するためのミドルウェアであるOracle Data Provider for .NETに関して説明しています。

====================

改訂記録

====================

2003年3月 初版

2004年7月 第2版

P.43のサンプルコードの「接続クラスのインスタンス化」の部分を訂正

1

Page 2: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved. 2

Agenda

1. .NET Framework概要– .NET Frmaeworkとは?– 共通言語ランタイム(CLR)– マネージ・コード vs. アンマネージ・コード

2. .NETとOracle RDBMS– Oracleへの接続方法– ODP.NETとその他接続方法の違い– ODP.NETの特徴– ODP.NETを使用するための要件– ADO.NETと比較した場合のODP.NET特徴的な機能詳細

3. 各データプロバイダーの比較

2

Page 3: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

.NET Framework

3

3

Page 4: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

.NET Framework

Visu

al S

tud

io .N

ET

.NET

Fra

mew

ork

Windows COM+

共通言語ランタイム(CLR)

基本クラス

ADO.NET

ASP.NET Windows Form

共通言語使用(CLS)

VB C++ C# JScript ・・・

複数言語サポートを目的とした.NET開発プラットホーム/実行環境

4

.NET Frameworkは、Microsoftが提供しているアプリケーション開発/実行環境です。

大きな特徴は以下の3つになります。

  ・プログラミング言語非依存

  ・堅牢性のあるソフトウェア(DLLバージョンの不整合を回避、ガーベージコレクション)

  ・WebアプリケーションやWebサービスの構築

共通言語仕様(CLS)

異なる開発言語の間で、互いのクラスを認識したり派生したりするためのルールです。CLSに準拠した言語で開発されたものをマネージコード、準拠しないWin32 APIで開発されたものをアンマネージコードと呼びます。

VB.NETやC#で開発されたものはマネージコード、COMなどはアンマネージコードになります。

ADO.NET

ADO.NETは、ADO(ActiveX Data Objects)と比べ、XMLと親和性が高く、HTTPなどを使用したデータアクセスも行えます。ちなみにADOは、OLE DBの持つ機能をカプセル化し、よりシンプルに操作できるようにしたもので、OLE DBの各機能への窓口のようなものです。

4

Page 5: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

CLR: 共通言語ランタイム

CLR基本クラスサポート

型チェッカー スレッドサポート

例外マネージャ 実行マネージャ

セキュリティエンジン デバックエンジン

MSILネイティブコンパイラ

クラスローダー

ガーベージコレクタ

コードマネージャ

.NETアプリケーションを効率よく安全に実行する実行エンジン

.NETアプリケーションは、OSやCPUに依存しない中間コード(MSIL)状態で管理されます

5

共通言語ランタイム(CLR)

CLRは大きく分けて4つの層から構成されています。最も最下層がクラスローダーで、メモリ上に.NETアプリケーションのクラスを展開します。

下から2層目が、ガベージコレクタやコードマネージャ、MSILネイティブコンパイラ(JITコンパイラ)です。

3層目に位置する型チェッカーや、スレッドサポートなどは、実行時に連携し、マネージコードが安全であることを保証し、開発やデバックを効率よく行うための機能を提供します。

最上層の基本クラスサポートによって,.NETアプリケーションが基本クラスを介してCLRにアクセスする事を実現します。

5

Page 6: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

CLR:共通言語ランタイム

共通言語ランタイムでの実行

中間コード(MSIL)を解釈し、実行する実行エンジン

.NET対応コンパイラ

中間コード(MSIL)

JITコンパイラ ネイティブコード(マネージコード)

クラスが初めて参照されるときに、クラスローダーによってクラスがメモリー上にロードされ、初めてメソッドが呼び出されたときにJITコンパイラがMSILをメソッド単位でコンパイル

・VB・C#・C++

6

現行のMicrosoftのOS Windows 2000では、.NET Frameworkは別途インストールする必要があります。次期OS(Windows Server 2003)では、.NET FrameworkはOSに組み込まれる予定です。

一度、JITコンパイラによってコンパイルされたネイティブコードは、メモリ上に残り再利用されます。

6

Page 7: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

言語の種類に依存しない

Windows

Visual Basic専用ランタイム・ライブラリ

ユーザー・ライブラリ

ユーザー・アプリケーション

Visual C++専用ランタイム・ライブラリ

ユーザー・ライブラリ

ユーザー・アプリケーション

同一言語で開発したライブラリの使用は容易

異なる言語で開発したライブラリの流用は困難

Windows

共通言語ランタイム(CLR)

ユーザー・ライブラリ

ユーザー・アプリケーション

ユーザー・ライブラリ

ユーザー・アプリケーション

言語に関係なくライブラリを相互に利用可能

従来

.NET Framework

7

従来の開発環境では、異なる言語のユーザー・ライブラリを流用することは難しかったのですが、CLRにより開発言語に関係なくユーザー・ライブラリを利用できるようになります。

7

Page 8: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

メモリー管理

Windows

オブジェクトを消去してメモリー領域を解放

.NET Framework

従来

.NET Framework

メモリー・リーク

使用中

未割り当て

ヒープ領域

アプリケーション

解放済み

オブジェクトを消去できないと、使われないメモリー領域が残る

Windows

解放済み

使用中

未割り当て

解放済み

アプリケーション

解放されない領域を発見すると解放

APからのヒープ領域への参照状況を監視

8

従来では、使用しているオブジェクトを消去すると、ヒープ領域の割り当てメモリーを解放する必要がありましたが、解放がうまく行えないと参照されない領域としてメモリー・リークが発生することがありました。

.NET Frameworkでは、アプリケーションのメモリー参照を監視し、参照されない領域を開放するためメモリー・リークは発生しないようになっています。これは、CLR内のガーベジ・コレタによるものです。

8

Page 9: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

.NET とOracle RDBMS

9

9

Page 10: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

Oracleへの接続(非.NET)アンマネージコード

RDO DAO

ODBCDriver

Jet

Oracle Net Services

ADO

OLE DBProvider

OO4OOracle Objects for OLE

COM AutomationServices

COM アクセス

ODBCDriver

ODBCBridge

10

Visual Basic6.0などの開発言語からOracleへ接続する場合は、ODBC、OLE DB、OO4Oなどのインタフェースにてアクセスすることが可能でした。

特にOO4OはOracleにネイティブに接続でき、かつOracle RDBMSの機能を最大限に引き出せるように拡張されているので使用頻度が高かったと思います。

10

Page 11: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

Oracleへの接続(.NET)マネージコード

Oracle Net Services

Oracle Data Provider for .NET

(ODP.NET)

RCW

Oracle Objectsfor OLE

OLE DB.NETデータプロバイダー

Oracle DataProvider for OLE DB

ODBC.NETデータプロバイダー

Oracle ODBCDriver for Oracle

Oracleが提供

11

Visual Basic6.0からVisual Basic.NETになり(他にも、C#やC++などがありますが)、ADO.NET開発者は、OLE DB.NETを介して、Oracle Data Provider for OLE DBを使用する方法や、Oracle Data Provider for .NETを使用してデータベースアプリケーションを開発することが可能です。

また、Visual Basic.NETで、OO4Oを使用することも可能です。これは、.NETアプリケーションからCOMサーバーにアクセスするために、MicrosoftよりRCW(Runtime Callable Wrapper)が提供されていることによります。

OO4Oは、COMコンポーネントでありこのRCWの機能を利用することができます。

ソリューションエクスプローラーの参照設定より、OO4O(Oracle InProc Server Type Library)を設定することで、Visual Basic.NETでもOO4Oが使用できるようになります。

11

Page 12: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

RCWって何 ?RCW(Runtime Callable Wrapper)

Oracle Objects for OLE

OraSession

OraDatabase

OraParameter

OraDynaset .NETクライアントRCW

マネージアンマネージ

RCWは、マネージコードがCOMサーバーを呼び出す場合のアンマネージとマネージの相違を克服します(Microsoftから提供されています)

COMサーバー

12

.NETからCOMオブジェクト(今回は、OO4O)が呼び出されると、ランタイムは、RCWを生成します。RCWはマネージ・オブジェクトでCLRによって保持されているヒープから割り当てられます。他のマネージ・オブジェクトと同様に、RCWへの参照はランタイムによってトレースされ、RCWはガーベジ・コレクションの対象になります。

RCWが吸収する違い:

1.下位のCOMオブジェクトの作成とバインディング

2.COMインタフェースの使用と、インタフェースのマネージ形式への変換

3.異なる環境間でのデータ変換のマッピング

4.ラッピングされたCOMオブジェクトの有効期間の管理

OO4Oとは関係ありませんが、RCWとは逆に、COMクライアントが.NETのメソッドを呼び出す場合には、CCW(COM Callable Wrapper)が使用されます。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconcomwrappers.asp

http://www.microsoft.com/japan/msdn/net/bda/cominterop.asp

12

Page 13: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETとその他の違い

•OLE DB.NET,ODBC.NET–オープンな規格に基づいたドライバー–データ・アクセスにブリッジが入る–Oracle提供以外のドライバーでは固有の機能が無い

•ODP.NET–Oracleネイティブなドライバー–データ・アクセスにブリッジが入らない–Oracle固有の機能のサポート

ODP.NETの方が高速で最適なアクセスを提供

•OO4O–COMサーバーである–RCWによるデータ変換等のオーバヘッドが発生する–Oracle固有の機能のサポート

13

ODP.NETは、OLE DB.NETや、ODBC.NETと比べると、パフォーマンスや、Oracle データベースの取り扱いについて優れています。

13

Page 14: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETとその他の違い(パフォーマンス)

接続方法の違いによる速度差

出展:翔泳社 月間ドットネット・マガジン 2003年2月号 著者 初音玲

1.500.631.141.00プライマリーキー以外の更新

1.110.791.021.00挿入

2.111.721.611.00プライマリーキー以外の参照

1087.60543.80543.801.002回目のログオン

1.021.000.981.00プログラム起動直後のログオン

MicrosoftOracle

ODP.NETOLE DB .NET Data ProviderOO4O

数値が大きいほどOO4Oに比べて速度が速い(OO4Oの速度を1とした場合の値)

14

実際のパフォーマンスの違いについて、月間ドットネット・マガジンに掲載された結果を参考値として紹介しています。

この記事で使用されているODP.NETは、β版です。製品版ではさらなる改良が施されておりますので、あくまで目安として参照ください。

プログラム起動後のログオン

データベース接続オブジェクトの生成から接続処理完了まで

2回目のログオン

初回は、.NET FrameworkのJITコンパイラの影響があるので、2回目以降を比較

プリマリーキー以外の参照

検索用オブジェクトの生成から解放までを100回ループ。検索にはプライマリーを使用するが、それ以外を参照することでプライマリーキーがキャッシュされていても性能が向上しないように配慮

挿入

挿入用オブジェクトの生成から解放までを100回ループ

プライマリーキー以外の更新

プライマリーキー以外を更新した場合を測定。更新用オブジェクトの生成から解放までを100回ループ

14

Page 15: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETの特徴的な機能

•PL/SQLの完全なサポート•ネイティブなOracleデータ型のサポート

–LOB型、REFカーソル、DATE型 ….•接続プーリング•配列バインド•グローバリゼーション

–Unicodeの完全サポート

•トランザクション–Microsoft Transaction Serverとの連携

•XML DBのサポート•透過的アプリケーションフェイルオーバー

15

SQL ServerデータプロバイダーやOLE DBデータプロバイダーで提供されている機能とODP.NETの機能を比較した場合、スライド中に説明されているような機能をODP.NETでは提供することが可能です。

これは、OLE DB.NETやODBC.NETと比較した場合も、ほぼ同じことが言えます。

15

Page 16: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

SQL Serverと比較した場合の開発生産性

.NET App

SQL Serverデータプロバイダ

OLE DBOLE DB.NET データプロバイダー

ODP for .NET

OracleProvider for OLE DB

OLE DB.NET データプロバイダー

プログラミングインターフェースは、ADO.NET - 接頭語がかわるだけ

OleDbDataReader(OLE DB.NETデータプロバイダー)SqlDataReader(SQL Serverデータプロバイダー)OracleDataReader(Oracle Data Provider for .NET)

16

よく、統合開発ツールにVisual Studio.NETを選択した場合、最適なデータベースはSQL Serverであると思われるかたが多いのは事実です。

確かに、そのような面は細かな点としてあるかもしれませんが、RDBMSをOracleにしたからといって開発生産性が落ちるということは無いと考えます。

Visual Studio.NETでは、SQL Serverデータプロバイダーは標準にて実装されています。ODP.NETを使用したい場合には、ODP.NETをインストール後、新規プロジェクト作成時に「参照設定」よりODP.NET(Oracle.DataAccess.dll)を追加する必要があります。

これにより、ODP.NETのクラス等が、コーディング時にコーディング候補リストとして表示されるようになります。

ODP.NETは、ADO.NET準拠ですが、SQL Serverデータプロバイダーにあって、ODP.NETにないオブジェクトも存在します(逆も当然ある)。

細かな違いにつては、それぞれのマニュアルを参照してください。

Oracle Data Provider for .NET:

http://otn.oracle.com/docs/tech/windows/odpnet/content.html

SQL Serverデータプロバイダ:

http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemDataSqlClient.asp

OLE DBデータプロバイダ:

http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemDataOleDb.asp

16

Page 17: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETアセンブリ

Oracle.DataAccess.dllでは2つの名前空間が提供される

•Oracle.DataAccess.Client–Oracle Data Provider for .NETのクラスを提供

•Oracle.DataAccess.Types–Oracle RDBMS内のネイティブデータ型のクラスを提供

‘===================================‘ Visual Basic.NET Coding Sample‘===================================

Imports Oracle.DataAccess.ClientImports Oracle.DataAccess.Types

17

ODP.NETアセンブリでは、2つの名前空間が提供されています。

データ・プロバイダーにあたるOracle.DataAccess.Clientと、ODP.NETを使用する際にOracle データベースのネイティブデータ型を使用するためのOracle.DataAccess.Typesです。

17

Page 18: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETオブジェクト・モデル

DataSet DataAdapter

Transaction

Command

Connection

DataReader

Connected Layer(ODP.NET)

DisconnectedLayer

CommandBuilder

DataLayer

•ODP.NETは、ADO.NETの仕様に準拠•Oracle DB用にビルドされているので、Oracleの機能を最大限に活用可能

18

ODP.NETのオブジェクト・モデルは、ADO.NETの仕様に準拠しています。ODP.NETは、コネクション層を意味します。

DataSetは、Microsoftが提供する非接続型のオブジェクトです。

ODP.NETは、DataSetとOracleデータベース間の接続を提供します。

18

Page 19: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETオブジェクト

DataSet

DataAdapter

Transaction

Command

Connection

DataReader

CommandBuilder

データベースに接続

データベースとの接続中、データを操作する。SQLコマンドの実行

データベースとDataSet間でデータを転送する

データの読み取りと更新

データベースからのデータストリームを格納する

ローカルのトランザクションを表すオブジェクト

DataSetが更新された時にDataAdapterに対する自動SQL生成をおこないます

19

19

Page 20: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

DataSetオブジェクト・モデル

•DataSetは非接続型のデータ・キャッシュです•変更内容は、DataAdapterやDMLコマンドによりデータソースに返します

DataSet

DataTableCollectionDataTable

DataRowCollection

DataColumnCollection

ConstraintCollection

DataRelationCollection

DataSetは、Microsoftから提供されているSystem.Data名前空間に含まれます

20

DataSet オブジェクトは、非接続のデータ キャッシュを表します。DataSetへは、DataAdapterのFillメソッドを使用してデータが充填されます。

このキャッシュは、DataTables および DataRelations から構成され、コマンドの結果を表します。DataSet は、キャッシュにおける基本的なデータの変化を追跡します。この変化は、DataAdapter および適用可能な Insert、Update、または Delete コマンドを使って元のデータ ソースに返すことができます。

20

Page 21: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETを利用したアクセス(接続型)

OracleConnection

OracleCommand

Connection

VB.NET

CommandText

OracleDataReader

ExecuteReader

①OracleConnectionオブジェクトの生成

②OracleConnectionオブジェクトをOracleCommandの  Connectionプロパティに設定

③SQL文を設定

④ExecuteReaderメソッドの実行

Read⑤ReadメソッドがTrueならレコードあり

21

このスライドでは、ODP.NETを使用した接続型のアクセスを表しています。

①OracleConnectionオブジェクトを生成し、データベースへの接続を確立します。

②SQL文を実行するための、OracleCommandオブジェクトに対して、①で取得したOracleConnectionオブジェクトを設定

③実行するSQL文をCommandTextプロパティに設定します。

④ExecuteReaderメソッドにてクエリーを実行

⑤Readメソッドにてレコードを取得

21

Page 22: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

DataSetを利用したアクセス(非接続型)

OracleConnection

OracleCommand

Connection

VB.NET

OracleDataAdapter

①OracleConnectionオブジェクトの生成

②OracleConnectionオブジェクトをOracleCommandの  Connectionプロパティに設定

SelectCommand

Fill

DataSet

③DataAdapterのプロパティに設定

④FillメソッドにてDataSetにデータを充填

自動連携

CommandText

22

このスライドでは、DataSetを使用した非接続型のアクセスを表しています。

①OracleConnectionオブジェクトを生成し、データベースへの接続を確立します。

②SQL文を実行するための、OracleCommandオブジェクトに対して、①で取得したOracleConnectionオブジェクトを設定

③OracleCommandオブジェクトをOracleDataReaderのSelectCommandプロパティに設定

④DataAdapterのFillメソッドにて、内部的にSelect文が発行されてDataSetにデータを充填

この例では、OracleCommandオブジェクトを使用してSELECT文を行っていますが、OracleDataAdapter自体にも内部的にDML用のCommandオブジェクトを持っているので、その個々のオブジェクトにOracleConnectionオブジェクトを割り当てて行うことも可能です。

22

Page 23: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

ODP.NETを使用するための要件

•対応オペレーティング・システム–Windows98, Windows NT4.0, Windows2000, Windows XP Pro(32 bit)

•接続先データベース–Oracle8 8.0.6以降

•クライアント環境–Oracle Client 9.2.0–Oracle Net Services 9.2.0–Microsoft .NET Framework–Oracle Services for Microsoft Transaction Server 9.2.0 (Microsoft Transaction Serverとの統合の場合)

システム要件

23

23

Page 24: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

VS.NETで使用するために(1)Visual Studio.NETでODP.NETを使用するには、参照設定にODP.NETを追加する

1. 新規プロジェクトで「Visual basicプロジェクト」を作成

2. ソリューション・エクスプローラーより、「参照設定」を右クリックして「参照の追加」を選択

24

ODP.NETはOracle.DataAccess.dllというダイナミックリンク・ライブラリにて提供されています。

Visual Basic.NET等で、ODP.NETを使用する場合には、参照設定にODP.NETのコンポーネントを追加する必要があります。

これにより、コーディング時に候補リストとかも出てくるようになります。

24

Page 25: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

VS.NETで使用するために(1)

3. ODP.NETのコンポーネントを追加

4. 参照設定に「Oracle.DataAccess」が追加される

25

25

Page 26: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

VS.NETで使用するために(2)

1. 右クリックにて「ツールボックスの     カストマイズ」を選択

2. .NETコンポーネント・タブよりOracleのオブジェクトを選択

ツールボックスをカストマイズして、ODP.NETコントロールをツールボックスに追加

26

フォームなどにコントロールを貼り付ける場合があると思いますが、そのままではツールボックスにODP.NETのコントロールは表示されていません。

ツールボックスのカストマイズにてODP.NETのコンポーネントが表示されるように設定する必要があります。

26

Page 27: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

VS.NETで使用するために(2)

3. ツールボックスにODP.NETのオブジェクトが表示される

ツールボックスをカストマイズして、ODP.NETコントロールをツールボックスに追加

27

27

Page 28: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

接続クラス(OracleConnection)

•接続文字列属性–DataSource, DBA Privilege, etc

•接続プーリング–Pooling, Max Pool Size, etc

•OS認証•特権接続

–SYSDBA, SYSOPER•パスワードの期限切れ

–OpenWithNewPassword•プロキシ認証

–Proxy User Id•TAF(透過的アプリケーション・フェイルオーバー)

–Failover

28

OracleConnectionオブジェクトでは、SQL Serverデータプロバイダーと違い、ODP.NET固有の機能が実装されています。

28

Page 29: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

接続プーリング

接続プーリングの設定は、接続文字列として設定します

‘===================================‘ Visual Basic.NET Coding Sample‘===================================‘接続文字列の作成  Dim sConn As Srting =

   “User Id=scott;password=tiger;Data Source=orcl;pooling=true;max pool size=50”

‘OracleConnectionのインスタンス化  conn = New OracleConnection(sConn)

‘データベースへの接続のオープン  Conn.Open()

29

ODP.NETで接続プーリングを使用する場合は、接続文字列の中にて設定します。

デフォルトでは、接続プーリングは有効になっています。

29

Page 30: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

OracleCommand

•フェッチサイズの指定–FetchSize

•LONG/LONG RAWデータの最適化–RowSize

•配列バインドの使用–ArrayBindCount

•ROWIDの使用–AddRowid

•Select for Updateをサポート–UpdatedRowSource

•OUTPUTパラメータ–アウトプットパラメータは、即時利用可能

30

OracleCommandオブジェクトでも、ODP.NET固有の機能がいくつかあります。

30

Page 31: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

FetchSize1回のサーバーラウンドトリップでフェッチされる行数の制御ラウンドトリップの回数が少ないほどパフォーマンスが向上します

‘===================================‘ Visual Basic.NET Coding Sample‘===================================‘INSERTに必要な配列の作成

Dim cmd As OracleCommand = New OracleCommand(“select * from emp”, conn)Dim rdr As OracleDataReader

‘SQL文の作成  rdr = cmd.ExecuteReader()

‘行のサイズを取得Dim sz As Long = cmd.RowSize

‘100行を1回のフェッチで取得できるようにフェッチサイズを設定  rdr.FetchSize = sz * 100

‘Readメソッドの実行While rdr.Read()

::

end While

31

SQL Serverデータプロバイダーでは、ConnectionのプロパティにPacketSizeがありネットワーク通信に使用するパケットサイズを設定できるようになっています(ODP.NETには無い)。値の範囲は、512Byte ~ 32767Byte(Default 8192Byte)です。

逆にSQL Serverデータプロバイダーは、ODP.NETのようにCommandやDataReaderクラスでのFetchSizeというプロパティは存在しません。

ODP.NETでは、OracleCommandやDataReaderのFetchSizeプロパティを使用することで、サーバーラウンドトリップの回数を制御することができます。

FetchSiezeプロパティのデフォルトは、65536Byteです。

Tips

FetchSizeというプロパティは、OracleCommand、OracleDataReaderクラスの2つに存在します。

あらかじめ設計時点にて、レコードサイズがわかっている場合には、OracleCommandのFetchSizeに指定できます。

レコードサイズが分からない場合は、OracleCommandのRowSizeプロパティにて取得できますが、ExexcuteReaderメソッドの実行後、OracleCommandには設定できません。その場合は、スライドの例のようにOracleDataReaderにて動的に設定します。

31

Page 32: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

配列バインド

ArrayBindCountは配列バインドを使用するかどうかを指定

‘===================================‘ Visual Basic.NET Coding Sample‘===================================‘INSERTに必要な配列の作成

Dim myArray() As Integer = New Integer() {0, 1, 2}

‘SQL文の作成  Dim cmd As New OracleCommand()

cmd.Connection = conn  cmd.CommandText = “insert into dept(deptno) values(:deptno)”

‘配列のバインドcmd.ArrayBindCount = 3Dim prm As OracleParameter = New OracleParameter(“deptno”, OracleDbType.Int32)prm.Direction = ParameterDirection.Inputprm.Value = myArraycmd.Parameters.Add(prm)

‘SQL文の実行  cmd.ExecuteNonQuery();

32

ODP.NETでは、配列バインドを使用することができます。これにより1回のサーバーラウンドトリップで複数の行をデータベースにINSERTすることが可能です。

32

Page 33: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

OracleRefCursor

CREATE OR REPLACE PACKAGE MyPackage ASTYPE empcur IS REF CURSOR;TYPE jobcur IS REF CURSOR;

PROCEDURE GetEmpRecords(p_cursor OUTPUT empcur,j_cursor OUTPUT jobcur,indeptno IN NUMBER,p_errorcode OUTPUT NUMBER);

END MyPackage/

OracleRefCursorは、REF CURSOR型に対応するODP.NET型です

CREATE OR REPLACE PACKAGE BODY MyPackage ASPROCEDURE GetEmpRecords(

p_cursor OUT empcur,j_cursor OUT jobcur,indeptno IN NUMBER,p_errorcode OUT NUMBER) IS

BEGINp_errorcode := 0;OPEN p_cursor FOR

SELECT * FROM emp WHERE deptno = indeptno;

OPEN j_curor FORSELECT * FROM dept;

EXCEPTIONWHEN OTHERS THEN

p_errorcode = SQLCODE;END GetEmpRecords;

END MyPackage;/

33

Ref Cursorは、Oracle PL/SQLにおけるデータ型です。これは、Oracleデータベースでのカーソルまたは結果セットを表します。

OracleRefCursorは、このRef Cursorに対応するODP.NET型になります。

33

Page 34: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

OracleRefCursor‘===================================‘ Visual Basic.NET Coding Sample‘===================================‘PL/SQLストアド・プロシージャの実行準備

Dim rdr As OracleDataReader  Dim cmd As New OracleCommand(“Mypack1.GetEmpRecords”, conn)  cmd.CommandType = ComandType.StoredProcedure

‘REF CURSORパラメータのバインド  cmd.Parameters.Add(“p_cursor”, OracleDbType.RefCursor, ParameterDirection.Output)  cmd.Parameters.Add(“j_cursor”, OracleDbType.RefCursor, ParameterDirection.Output)  cmd.Parameters.Add(“indeptno”, OracleDbType.Decimal ,10, ParameterDirection.Input)  cmd.Parameters.Add(“p_errorcode”, OracleDbType.Int32, ParameterDirection.Output)

‘SQL文の実行とRef Cursorの使用rdr = cmd.ExecuteReader()Dim more As Boolean = TrueDo While more = True

Do While(rdr.Read())Console.WriteLine(“Reading….”)

LoopIf more = True Then

Console.Writeline(“Next Result”)End If

Loop

34

34

Page 35: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

セーフ型マッピング

–NUMBER–DATE–TIMESTAMP–INTERVAL DAY TO SECOND

以下のOracleデータ型は、.NET型に変換する(.NETDataSetに移入する)際にデータを消失する可能性があります

OracleDataAdapterのセーフ型マッピングを使用する事により次のいずれかの型としてDataSet内で表すことが可能になります

–Oracle書式での.NET Byte[]–.NETのString

35

Oracle データ型は、密接に関連する.NET 型に変換される際にデータが失われる可能性があるため、ODP.NET のOracleDataAdapter ではセーフ型マッピング機能が提供されています。

これを使用することにより、データは失われず、DataSet内でデータを確実にあらわすことができます。

35

Page 36: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

セーフ型マッピングe.g)NUMBER

OracleのNumber型は最大38精度、.NETのDecimal型は最大28精度

-79,228,162,514,264,337,593,543,950,335

-9.9999999999999999999999999999999999999e125

最小値

79,228,162,514,264,337,593,543,950,335

9.9999999999999999999999999999999999999e125

最大値

.NETのDecimalOracleのNumber

‘===================================‘ Visual Basic.NET Coding Sample‘===================================‘OracleDataAdapterのインスタンス化

Dim adapt As OracleDataAdapter = New OracleDataAdapter(“select empno from emp”, conn)

‘SafeMappingの設定 empnoを.NETのString型へマッピング  adpt.SafeMapping.Add(“empno”, GetType(System.String))

‘DataSetへのデータ充填  Dim dataset As DataSet = New DataSet()

adapt.Fill(dataset, “emp”)

36

その他のデータ消失の可能性があるデータ型

-------------------------------------------------------------------------------------------------

OracleのDate .NETのDateTime

-------- --------------------- ----------------------------------

最大値 Dec 31, 9999 AD Dec 31, 9999 AD 25:59:59.9999999

最小値 Jan 1, 4712 BC Jan 1, 0001 AD 00:00:00.0000000

----------------------------------------------------------------------------------------------------------

OracleのTimestamp .NETのDateTime

-------- --------------------------------------- ----------------------------------

最大値 Dec 31, 9999 AD 23:59:59.000000000 Dec 31, 9999 AD 25:59:59.9999999

最小値 Jan 1, 4712 BC 00:00:00.000000000 Jan 1, 0001 AD 00:00:00.0000000

サンプルは、以下のUS OTNを参照のこと

http://otn.oracle.com/sample_code/tech/windows/odpnet/content.html

36

Page 37: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

XMLの取り扱い

create or replace procedure getempsasxml(theclob OUT CLOB)

isctx dbms_xmlgen.ctxhandle;

beginctx := dbms_xmlgen.newContext('select * from emp');theclob := dbms_xmlgen.getXML(ctx);dbms_xmlgen.closeContext(ctx);

end;/

Oracle9i R2では、ODP.NETでXML DBはサポートされません。XMLの処理には、PL/SQLプロシージャと、CLOB型を使用します

dbms_xmlgenパッケージを使用したストアド・プロシージャ

37

ODP.NETの最初のリリース(9.2.0.2)では、XML DBはサポートされていません。

XMLを取り扱う場合には、PL/SQLプロシージャとCLOBを使用します。

37

Page 38: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

XMLの取り扱い

‘===================================‘ Visual Basic.NET Coding Sample‘===================================‘XML文書を作成するストアド・プロシージャの実行

Dim cmd As OracleCommand = New OracleCommand(“getempsasxml”, conn)cmd.CommandType = CommandType.StoredProcedurecmd.Parameters.Add(“THECLOB”, OracleDbType.Clob, ParameterDirection.Output)

  cmd.ExecuteNonQuery()

Dim l As OracleClob = New OracleClob(conn)l = cmd.Parameters(“THECLOB”).Value

Console.WriteLine(l.Value)

38

38

Page 39: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

トランザクション

‘===================================‘ Visual Basic.NET Coding Sample‘===================================  conn = New OracleConnection(sConn)  conn.Open() Dim cmd As OracleCommand = New OracleCommand(“”, conn)

‘トランザクションの開始  Dim txn As OracleTransaction = conn.BeginTransaction()

cmd.CommandText = “insert into emp(empno) values(9999)”cmd.CommandType = Command.Textcmd.ExecuteNonQuery()

txn.Commit() 

接続インスタンスでBeginTransactionメソッドを実行することでトランザクションインスタンスを返す

Commit、Rollback、名前付きセーブポイントをサポート

39

Oracleデータベースでは、接続のコンテキストのみでトランザクションが開始されます。

ODP.NETでは、OracleConnectionオブジェクトに対してトランザクションを開始する(BeginTransactionメソッド)ことのみで、これを行います。

OracleCommandのTransactionプロパティは、読み取り専用であり、OracleCommandに使用される接続によってのみ決まり、Transactionプロパティに対してトランザクション・オブジェクトを割り当てる必要はありません。

また、分散トランザクションは、System.EnterpriseServicesによってサポートされ、Oracle Services for MTSが必要になります。

System.EnterpriseServicesについては、以下を参照してください。

  http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfSystemEnterpriseServices.asp

参考

SQL Serverデータプロバイダでは、SqlDataAdapterを使用したトランザクションの実行のために、SqlCommandのTransactionプロパティを設定します。

==================================================

Dim cn As New SqlConnection(strConn)

Dim da As New SqlDataAdapter(strSQL, cn)

Dim txn As SqlTransaction = cn.BeginTransaction()

da.UpdateCommand.Transaction = txn

da.InsertCommand.Transaction = txn

da.DeleteCommand.Transaction = txn

==================================================

39

Page 40: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

グローバリゼーション

‘===================================‘ Visual Basic.NET Coding Sample‘===================================‘セッションにおけるグロバリゼーションを取得

Dim SessionGlob As OracleGlobalization = conn.GetSessionInfo()

‘日付書式を設定する  SessionGlob.Dateformat = “YYYY/MM/DD HH24:Mi:SS”

conn.SetSessionInfo(SessionGlob)

グローバリゼーションの設定に従って、日付、時刻、通貨、数値、ソート順が適用されます

40

グローバリゼーションの設定個所は3つあります。1つがクライアント、1つがセッション、最後がスレッドです。

クライアント・グローバリゼーションは、WindowsのレジストリのNLS_LANGから導出され、OPD.NET内では、その設定値は参照のみが可能です。

セッション・グローバリゼーションは、接続がオープンされたときに暗黙的に、クライアントのグロバリゼーションの設定値が設定されます。

スライドのコードサンプルにように接続オブジェクトのSetSessionInfoメソッドにて再設定が可能です。

40

Page 41: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

各データプロバイダの比較

DBで作成するトランザクション

スキーマ テーブルの種類を返す

RowUpdatedイベントのデータ提供

セキュリティ アクションをカスタム セキュ

リティ属性に関連付け

セキュリティ レベルをユーザーに割当

パラメータの収集

パラメータ

InfoMessageイベントのデータ提供

グローバリゼーション設定

TAFイベントに対するデータを提供

DBからのエラーでスローされる例外

プロバイダのエラーを収集

DBからのエラーに関する情報を収集

.NET Frameworkのサポートを目的

DBからのデータストリームを読み取り

DBとDataSet間のデータ転送

DBへの接続

DataSet への変更を調整する

SQLコマンドやストアードプロシージャ

OracleTransactionOleDbTransactionSqlTransaction

OleDbSchemaGuid

OraclelRowUpdatedEventArgsOleDbRowUpdatedEventArgsSqlRowUpdatedEventArgs

OleDbClientPermissionAttributeSqlClientPermissionAttribute

OleDbClientPermissionSqlClientPermission

OracleParameterCollectionOleDbParameterCollectionSqlParameterCollection

OracleParameterOleDbParameterSqlParameter

OracleinfoMessageEventargsOleDbinfoMessageEventargsSqlinfoMessageEventargs

OracleGlobalization

OracleFailoverEventArgs

OracleExceptionOleDbExceptionSqlException

OracleErrorCollectionOleDbErrorCollectionSqlErrorCollection

OraclelErrorOleDbErrorSqlError

SqlDebugging

OracleDataReaderOleDbDataReaderSqlDataReader

OracleDataAdapterOleDbDataAdapterSqlDataAdapter

OracleConnectionOleDbConnectionSqlConnection

OracleCommandBuilderOleDbCommandBuilderSqlCommandBuilder

OracleCommandOleDbCommandSqlCommand

Oracle.DataAccessSystem.Data.OleDbSystem.Data.SqlClient

41

41

Page 42: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

Copyright © Oracle Corporation Japan, 2003. All rights reserved.

関連情報

•ODP.NET関連–http://otn.oracle.com/tech/windows/odpnet/content.html–http://otn.oracle.co.jp/software/tech/windows/odpnet/index.html–http://windows.us.oracle.com/

•Microsoft–http://www.microsoft.com/japan/msdn/library/ja/cpref/html/cpref_start.asp 

42

42

Page 43: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

43

<サンプル・コード> - Visual Basic.NET

以下のサンプル・コードは、ODP.NETのオブジェクトの使用方法を説明することを目的としているため、エラー処理などの細かなコーディングは割愛しています。

オブジェクトの関連については、スライド21を参照してください。

‘---ODP.NETを修飾を行わずに使用できるようにImportsステートメントを実行

Imports System.IO

Imports Oracle.DataAccess.Client

Imports Oracle.DataAccess.Type

‘---Oracleに対する接続文字列の編集と、接続クラスのインスタンス化

Dim conn As New OracleConnection

Dim sConn as String = “User ID=scott;Password=tiger;Data Source=orcl”

conn = New OracleConnection(sConn)

‘---データベースとの接続を開く

conn.Open()

‘---SQL文を実行するために、OracleCommand、OracleDataReaderを宣言

Dim cmd As New OracleCommand()

Dim rdr As OracleDataReader

‘---SQL文をCommandTextプロパティに設定し、ExexcuteReaderメソッドにてSQL文を実行

cmd.Connection = conn

cmd.CommandText = “select ename from emp where empno = 7876”

rdr = cmd.ExecuteReader

‘---実行結果があれば表示し、なければエラーメッセージを表示

If rdr.Read Then

MsgBox(rdr(“ENAME”))

Else

MsgBox(“Record Not Found!!”)

End If

‘---OracleDatReaderオブジェクトを終了し、OracleCommandオブジェクトを解放

rdr.Close()

cmd.Dispose()

Page 44: NET環境における Oracle DBの活用otndnld.oracle.co.jp/tech/windows/odpnet/odpnet_doc15409.pdf · 2004-07-23 · .NET環境における Oracle DBの活用 日本オラクル株式会社

44