net環境における oracle...
TRANSCRIPT
.NET環境における Oracle DBの活用
日本オラクル株式会社
本資料では、.NET環境からOracle RDBMSにネイティブに接続するためのミドルウェアであるOracle Data Provider for .NETに関して説明しています。
====================
改訂記録
====================
2003年3月 初版
2004年7月 第2版
P.43のサンプルコードの「接続クラスのインスタンス化」の部分を訂正
1
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
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
.NET Framework
3
3
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
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
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
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
言語の種類に依存しない
Windows
Visual Basic専用ランタイム・ライブラリ
ユーザー・ライブラリ
ユーザー・アプリケーション
Visual C++専用ランタイム・ライブラリ
ユーザー・ライブラリ
ユーザー・アプリケーション
同一言語で開発したライブラリの使用は容易
異なる言語で開発したライブラリの流用は困難
Windows
共通言語ランタイム(CLR)
ユーザー・ライブラリ
ユーザー・アプリケーション
ユーザー・ライブラリ
ユーザー・アプリケーション
言語に関係なくライブラリを相互に利用可能
従来
.NET Framework
7
従来の開発環境では、異なる言語のユーザー・ライブラリを流用することは難しかったのですが、CLRにより開発言語に関係なくユーザー・ライブラリを利用できるようになります。
7
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
メモリー管理
Windows
オブジェクトを消去してメモリー領域を解放
.NET Framework
従来
.NET Framework
メモリー・リーク
使用中
未割り当て
ヒープ領域
アプリケーション
解放済み
オブジェクトを消去できないと、使われないメモリー領域が残る
Windows
解放済み
使用中
未割り当て
解放済み
アプリケーション
解放されない領域を発見すると解放
APからのヒープ領域への参照状況を監視
8
従来では、使用しているオブジェクトを消去すると、ヒープ領域の割り当てメモリーを解放する必要がありましたが、解放がうまく行えないと参照されない領域としてメモリー・リークが発生することがありました。
.NET Frameworkでは、アプリケーションのメモリー参照を監視し、参照されない領域を開放するためメモリー・リークは発生しないようになっています。これは、CLR内のガーベジ・コレタによるものです。
8
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
.NET とOracle RDBMS
9
9
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
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
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
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
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
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
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
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
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
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
ODP.NETオブジェクト
DataSet
DataAdapter
Transaction
Command
Connection
DataReader
CommandBuilder
データベースに接続
データベースとの接続中、データを操作する。SQLコマンドの実行
データベースとDataSet間でデータを転送する
データの読み取りと更新
データベースからのデータストリームを格納する
ローカルのトランザクションを表すオブジェクト
DataSetが更新された時にDataAdapterに対する自動SQL生成をおこないます
19
19
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
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
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
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
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
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
VS.NETで使用するために(1)
3. ODP.NETのコンポーネントを追加
4. 参照設定に「Oracle.DataAccess」が追加される
25
25
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
VS.NETで使用するために(2)
1. 右クリックにて「ツールボックスの カストマイズ」を選択
2. .NETコンポーネント・タブよりOracleのオブジェクトを選択
ツールボックスをカストマイズして、ODP.NETコントロールをツールボックスに追加
26
フォームなどにコントロールを貼り付ける場合があると思いますが、そのままではツールボックスにODP.NETのコントロールは表示されていません。
ツールボックスのカストマイズにてODP.NETのコンポーネントが表示されるように設定する必要があります。
26
Copyright © Oracle Corporation Japan, 2003. All rights reserved.
VS.NETで使用するために(2)
3. ツールボックスにODP.NETのオブジェクトが表示される
ツールボックスをカストマイズして、ODP.NETコントロールをツールボックスに追加
27
27
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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()
44