この章では、Oracle Provider for OLE DB(OraOLEDB)のコンポーネントについて、およびこれらのコンポーネントを使用してOLE DBコンシューマ・アプリケーションを開発する方法について説明します。
この章の項目は次のとおりです。
次の各項で、OraOLEDBのプロバイダ固有の機能について説明します。
この他のプロバイダ固有の情報は、付録A「プロバイダ固有の情報」を参照してください。
OraOLEDBでサポートされるデータ型とUnicodeおよび非Unicodeのマッピングを表A-1に示します。
OraOLEDBでは、次の各項で説明するOracleデータ型がサポートされています。
Oracle Database 10gに導入されたデータ型
BINARY_FLOAT
BINARY_DOUBLE
Oracle9iに導入されたデータ型
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
|
関連項目: 前述のデータ型とその他のデータ型、およびタイムゾーンの詳細は、『Oracle Database SQL言語リファレンス』を参照 |
BINARY_FLOATは、OLE DBのDBTYPE_R4にマップされる単精度浮動小数点データ型(4バイト)です。
BINARY_DOUBLEは、OLE DBのDBTYPE_R8にマップされる倍精度浮動小数点データ型(8バイト)です。
ここでは、タイムスタンプ・データ型について説明し、次の例を示します。
各タイムスタンプ・データ型を使用した挿入操作および取得操作を示すサンプル・データ。
タイムスタンプ・データ型を使用したVisual Basicのコード例。
タイムスタンプ・データ型は、OLE DBのDBTYPE_DBTIMESTAMPにマップされます。OLE DBのDBTYPE_DBTIMESTAMPデータ型には、TIME ZONE情報はありません。
タイムスタンプ・データ型には次のものがあります。
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
データの挿入
TIMESTAMP WITH TIME ZONEまたはTIMESTAMP WITH LOCAL TIME ZONE列へのデータの挿入には、クライアントのタイムゾーン設定が使用されます。
OLE DBのタイムスタンプ・データ型ではタイムゾーン情報が提供されません。挿入操作の場合、クライアント・セッションからのデフォルト・タイムゾーンがTIMESTAMP WITH TIME ZONE列のデータに追加されます。
データの取出し
データ取得では、TIMESTAMP WITH TIME ZONE列にはTIME ZONEが使用されませんが、TIMESTAMP WITH LOCAL TIME ZONE列にはTIME ZONEが使用されます。
OLE DBのタイムスタンプ・データ型にはタイムゾーン情報を格納できません。
秒の端数
TIMESTAMPデータ型とCommandオブジェクトのバインドでは、秒の端数がサポートされていません。
タイムゾーン情報を変更するためにALTER SESSIONを使用すると新規または既存のRecordsetのタイムゾーン情報は変更されません(Recordsetはオペレーティング・システムの地域オプションのクライアント・タイムゾーン設定を使用します)。TIMESTAMPのfractional_seconds_precisionの最大値は9で、デフォルトの精度は6です。
ADOコンシューマ
タイムスタンプ・データ型の場合、ADOコンシューマは、CursorLocationの値をadUseServerとして指定し、DML操作にRecordsetを使用する必要があります。
タイムスタンプの挿入および取出し例
次の例では、デフォルトの精度6を使用するものと想定しています。
TIMESTAMP列
データ挿入: 4/16/2003 11:19:19 AM(タイムゾーンなし)
DB内のデータ: 4/16/2003 11.19.19.000000 AM
データ取出し: 4/16/2003 11:19:19 AM
TIMESTAMP WITH TIME ZONE列
データ挿入: 4/16/2003 11:19:19 AM(クライアント・セッションのタイムゾーンを使用)
DB内のデータ: 4/16/2003 11.19.19.000000 AM -07:00
データ取出し: 4/16/2003 11:19:19 AM(タイムゾーンをドロップ)
TIMESTAMP WITH LOCAL TIME ZONE列
次の例では、クライアント・セッションのタイムゾーンが-04:00で、現在US EDT(米国東部夏時間)にあるものと仮定しています。挿入操作では、TIMESTAMP WITH LOCAL TIME ZONE列のデータにはタイムゾーンのずれは含まれませんが、そのTIMESTAMPデータは、US PDT (太平洋夏時間)と同じであるデータベースのタイムゾーン-07:00に標準化されます。
問合せに対して、データはクライアント・セッションのタイムゾーンで返されます。タイムゾーンによる時差とは、ローカル時間と協定世界時(UTC)との差異(時分単位)を指します。
データ挿入: 4/16/2003 4:30:23 PM(クライアント・タイムゾーンは-04:00)
DB内のデータ: 4/16/2003 01.30.23.000000 PM(データベースのタイムゾーンは-07:00)
データ取出し: 4/16/2003 4:30:23 PM(クライアント・タイムゾーンは-04:00)
データ取出し: 4/16/2003 3:30:23 PM(クライアント・タイムゾーンは-05:00)
データ取出し: 4/16/2003 2:30:23 PM(クライアント・タイムゾーンは-06:00)
データ取出し: 4/16/2003 1:30:23 PM(クライアント・タイムゾーンは-07:00)
...
Dim DT As Date
DT = Now()
con.ConnectionString = "Provider=OraOLEDB.Oracle.1;User ID=user_name;" & _
"Password=pwd;Data Source=Oracle;"
con.Open
'Must use adUseServer
rec.CursorLocation = adUseServer
rec.ActiveConnection = con
rec.Open "select timestamp_column from test_table", con, adOpenDynamic,_
adLockOptimistic
rec.AddNew Array("timestamp_column"), Array(DT)
update data
rec.Update Array("timestamp_column"), Array("07/07/07 07:17:17 AM")
...
期間データ型は、OLE DBのDBTYPE_STRにマップされます。期間データ型には次のものがあります。
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
INTERVAL YEAR TO MONTH列では、year_precisionの最大は9で、デフォルトは2です。INTERVAL DAY TO SECOND列では、day_precisionの最大は9、デフォルトは2で、fractional_seconds_precisionの最大は9、デフォルトは6です。
|
注意: 符号が指定されていない場合、デフォルトは+です。 |
INTERVAL YEAR TO MONTH
使用方法: (符号)years-months
例:
2-3
2年3か月
+2-3
2年3か月
-2-3
-2年3か月
INTERVAL DAY TO SECOND
使用方法: (符号)days hours:minutes:seconds.second_fraction
例:
7 10:20:30.123456
7日と10時間20分30.123456秒
+7 10:20:30.123456
7日と10時間20分30.123456秒
-7 10:20:30.123456
-7日と10時間20分30.123456秒
Visual Basicの例
...
con.ConnectionString = "Provider=OraOLEDB.Oracle.1;User ID=user_name;"& _
"Password=pwd;Data Source=Oracle;"
con.Open
'no restriction on using adUseServer or adUseClient
rec.CursorLocation = adUseServer
rec.ActiveConnection = con
rec.Open "select * from test_table2", con, adOpenDynamic, adLockOptimistic
rec.AddNew Array("year_to_month_column", "day_to_second_column"), _
Array("8-1", "3 20:30:10.12")
'update data
rec.Update Array("year_to_month_column", "day_to_second_column"), _
Array("2-3", "7 10:20:30.123456")
...
OraOLEDBのデータソース・オブジェクトは、Oracle Databaseへの最初の接続を確立します。初期接続を確立するために、コンシューマはCoCreateInstanceファンクションを使用してデータソース・オブジェクトのインスタンスを作成する必要があります。このファンクションでは、プロバイダに関する重要な情報(プロバイダのクラスIDと実行可能なコンテキスト)が必要です。OraOLEDBのクラスIDは、CLSID_OraOLEDBです。
OraOLEDBはインプロセス・サーバーです。CoCreateInstanceをコールするには、CLSCTX_INPROC_SERVERマクロを使用します。次に例を示します。
// create an instance of OraOLEDB data source object and
// obtain the IDBInitialize interface
hr = CoCreateInstance(CLSID_OraOLEDB, NULL,
CLSCTX_INPROC_SERVER, IID_IDBInitialize,
(void**)&pIDBInitialize);
上のコード・スニペットでは、データソース・オブジェクトをインスタンス化しても、OLEDBサービスは有効になりません。OLEDBサービスを有効にするには、この後の「OLE DBサービスとの互換性」を参照してください。
|
注意: OraOLEDBは、永続データソース・オブジェクトをサポートしません。 |
データソース・オブジェクトのインスタンスが正常に作成されると、コンシューマ・アプリケーションはそのデータソースを初期化してセッションを作成できます。
OraOLEDBは、Oracle8i以上との接続をサポートします。特定のデータベースと接続するために、コンシューマはDBPROPSET_DBINITプロパティ・セットの次のプロパティを設定する必要があります。
また、コンシューマは、DBPROP_INIT_PROMPTにDBPROMPT_PROMPTを使用できます。これを使用すると、プロバイダがログオン・ボックスを表示するので、ユーザーは接続情報を入力できるようになります。
DBPROMPT_NOPROMPTを使用すると、ログオン・ボックスの表示ができなくなります。この場合は、ログオン情報が不完全なために、プロバイダはログオン・エラーを返します。ただし、このプロパティにDBPROMPT_COMPLETEまたはDBPROMPT_COMPLETEREQUIREDが設定されている場合は、ログオン情報が不完全な場合にのみログオン・ボックスが表示されます。
OraOLEDBは、OLE DB Version 2.0以上で使用可能なOLE DBサービスと互換性があります。OLE DBサービスには、自動トランザクション登録、クライアント・カーソル・エンジン(CCE)、接続およびセッション・プールといった、アプリケーションのパフォーマンス向上に役立つ有用なサービスが含まれています。
OLE DBサービスは、C++/COMまたはADOを介してOraOLEDBで使用できます。
デフォルトでは、OraOLEDBのCLSIDの下にあるOraOLEDBのOLEDB_SERVICESレジストリ・エントリが0xffffffff(-1)に設定され、すべてのサービスが有効になります。DBPROP_INIT_OLEDBSERVICESプロパティの設定を使用して、プログラムによって特定のOLE DBサービスを無効または有効にすることもできます。
|
関連項目: OLE DBサービスの詳細、および特定のサービスを有効または無効にする方法の詳細は、http://msdn.microsoft.com/en-us/library/ms724518(VS.85).aspxを参照してください。 |
ADOでは、OLE DBサービスが自動的に有効になります。このため、ADOアプリケーションでOLEDBサービスを使用するために特別なコードは必要ありません。
C++/COMアプリケーションでOLE DBサービスを使用するためには、いくつかの追加手順が必要です。
次のコード・スニペットは、C++/COMアプリケーションでOLE DBサービスを有効にする1つの方法を示しています。このコードは、CoCreateInstance()を使用してCLSID_MSDAINITIALIZEクラスのインスタンスを作成し、そのオブジェクトからIDataInitializeインタフェースを取得した後、そのインタフェースを介してOLE DBデータソース・オブジェクトを作成するOLE DBコンシューマを示しています。
// Instantiate the CLSID_MSDAINITIALIZE class and request for the
// IID_IDataInitialize interface from it
hr = CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER,
IID_IDataInitialize, (void**)&pIDataInitialize);
// Set properties, datasource name, userid, and password, etc.
...
// Create an OLEDB data source object using the interface obtained from the
// CLSID_MSDAINITIALIZE class.
hr = pIDataInitialize->CreateDBInstance(CLSID_OraOLEDB, NULL,
CLSCTX_INPROC_SERVER, NULL,IID_IDBInitialize,(IUnknown**)&pIDBInitialize);
...
// If connection/session pooling was enabled, pIDBInitialize->Release()
// releases the connection/session back to the pool.
// pIDataInitialize->Release() should not be called until the application no
// longer need to use connection/session pooling and the rest of
// the OLE DB Services that were enabled for the application.
//
pIDBInitialize->Release();
OraOLEDBを使用してOracle Databaseに接続するには、OLE DB接続文字列を次のように設定する必要があります。
"Provider=OraOLEDB.Oracle;User ID=user;Password=pwd;Data Source=constr;"
リモート・データベースに接続するには、Data Sourceに、適切なネット・サービス名(tnsnames.oraファイル内にある別名)を設定する必要があります。詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。
OraOLEDBによって、プロバイダ固有の接続文字列属性が提供されますが、これらはプロバイダおよびユーザーIDの設定方法と同じ方法で設定されます。プロバイダ固有の接続文字列属性は、次のとおりです。
CacheType - クライアント上の行セット・データの格納に使用する、キャッシュのタイプを指定します。「行セットのためのOraOLEDB固有の接続文字列属性」を参照してください。
ChunkSize - プロバイダのキャッシュに格納される、LONG型またはLONG RAW型の列データのサイズを指定します。「行セットのためのOraOLEDB固有の接続文字列属性」を参照してください。
DistribTX - 分散トランザクションの登録機能を有効または無効にします。「分散トランザクション」を参照してください。
FetchSize - 取り出す配列のサイズを行数で指定します。「行セットのためのOraOLEDB固有の接続文字列属性」を参照してください。
OLEDB.NET - OLEDB.NETデータ・プロバイダとの互換性を有効または無効にします。「OLEDB.NETデータ・プロバイダの互換性」を参照してください。
OSAuthent - Oracle Databaseに接続するときに、オペレーティング・システム認証が使用されるかどうかを指定します。「オペレーティング・システム認証」を参照してください。
PLSQLRSet - PL/SQLストアド・プロシージャから行セットを返す機能を有効または無効にします。「コマンドのためのOraOLEDBカスタム・プロパティ」を参照してください。
PwdChgDlg - パスワードが期限切れになったときに、パスワード変更ダイアログ・ボックスを表示可能または不可にします。「パスワードの期限」を参照してください。
UseSessionFormat - セッションの間、NLSセッションのデフォルトの書式を使用するか、OraOLEDBでこれらの書式の一部を上書きするかを指定します。有効値は0(FALSE)と1(TRUE)です。デフォルト値はFALSEで、OraOLEDBはNLSセッションのデフォルトの書式の一部を上書きできます。値がTRUEの場合、OraOLEDBはNLSセッションのデフォルトの書式を使用します。
この接続属性は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下に表示されないので注意してください。
VCharNull - ストアド・プロシージャでVARCHAR2 OUTパラメータのヌル文字での終了を有効または無効にします。
SPPrmDefVal - アプリケーションでストアド・プロシージャのパラメータ値が指定されていない場合に、デフォルト値とNULL値のどちらを使用するかを指定します。
NDataType: コマンドにバインドされているパラメータのいずれかがNデータ型かどうかを指定しますが、これには、NCHAR、NVARCHARまたはNCLOBが含まれます。「NDatatype」を参照してください。
この接続属性は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下に表示されないので注意してください。
SPPrmsLOB: ストアド・プロシージャにバインドされている1つ以上のパラメータがLOBデータ型かどうかを指定しますが、これには、CLOB、BLOBまたはNCLOBが含まれます。「SPPrmsLOB」を参照してください。
この接続属性は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下に表示されないので注意してください。
StmtCacheSize - キャッシュできる文の最大数を指定します。「文のキャッシュ」を参照してください。
MetaDataCacheSize - メタデータをキャッシュできるSELECT文の最大数を指定します。「メタデータのキャッシュ」を参照してください。
DeferUpdChk - 読取り専用の非接続行セットの更新がサポートされるよう、更新可能性チェックを遅らせるかどうかを指定します。「行セットのためのOraOLEDB固有の接続文字列属性」の「DeferUpdChk」を参照してください。
DBNotifications - 高可用性イベントにサブスクライブするかどうかを指定します。「拡張フェイルオーバー機能」を参照してください。
DBNotificationPort - データベース通知のリスニング用に開かれるポート番号を指定します。「拡張フェイルオーバー機能」を参照してください。
この属性のデフォルト値は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下にあります。このKEY_HOMENAMEはOracleホームです。
レジストリにあるすべてのデフォルト値は、プロバイダがメモリーにロードされたときに、OraOLEDBによってそのレジストリから読み込まれます。接続時にOracle固有の接続文字列属性が与えられない場合は、デフォルトのレジストリ値を使用します。ただし、属性が与えられた場合は、新しい値によってデフォルトのレジストリ値が上書きされます。
DBPROPSET_DBINITプロパティ・セットの中のDBPROP_INIT_PROVIDERSTRINGプロパティを設定した場合も、これらの属性を設定できます。次に例を示します。
"FetchSize=100;CacheType=Memory;OSAuthent=0;PLSQLRSet=1;StmtCacheSize=10;"
DistribTX属性は、セッションを分散トランザクションに登録できるかどうかを指定します。有効値は0(使用不可)と1(使用可能)です。デフォルトは1で、セッションを分散トランザクションに登録できることを示します。
Microsoft Transaction Serverを使用しているアプリケーションでは、DistribTXをデフォルトの1に設定する必要があります。
この機能により、フェイルオーバー機能が強化されます。
これらの接続文字列属性のサポートにより、フェイルオーバー機能が強化されました。
DBNotifications
DBNotifications属性は、高可用性イベントにサブスクライブするかどうかを指定します。有効値は0(FALSE)と1(TRUE)です。デフォルトはFALSEで、OraOLEDBが高可用性イベントにサブスクライブされないことを示します。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。
DBNotificationPort
DBNotificationPort属性は、データベース通知のリスニングに使用されるポート番号を指定します。有効値は符号なしの整数です。
DBNotificationPortは、接続文字列属性またはレジストリ・エントリのいずれかを使用してDBNotifications属性がTRUEに設定されている場合にのみ有効です。DBNotificationPort属性のデフォルトは0で、これはOraOLEDBが有効なポートをランダムに開くことを意味します。OraOLEDBはポート番号を検証しないため、有効なポート番号を指定するのはアプリケーションの役割です。
レジストリ・エントリを使用したフェイルオーバー機能の有効化
DBNotifications
DBNotificationsレジストリ・エントリは、高可用性イベントにサブスクライブするかどうかを指定します。有効値は0(FALSE)と1(TRUE)です。デフォルト値はFALSEで、OraOLEDBはサブスクライブされません。このレジストリ・エントリ値は、DBNotifications接続文字列属性が設定されていない場合に使用されます。この値は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下にあります。
OSAuthent属性は、Oracle Databaseに接続するときに、オペレーティング・システム認証が使用されるかどうかを指定します。有効値は0(使用不可)と1(使用可能)です。デフォルトは0で、オペレーティング・システム認証が使用されないことを示します。
オペレーティング・システム認証という機能によって、Oracleはユーザーを認証するためにオペレーティング・システムのセキュリティ・メカニズムを使用します。この詳細とWindowsクライアントの設定方法は、Oracle Databaseのプラットフォーム・ガイドで、Windowsでのデータベース・ユーザーの認証に関する情報を参照してください。
Windowsクライアントがオペレーティング・システム認証のために正しく設定されると、OraOLEDBクライアントは、次のいずれかを設定することでこの機能を使用できるようになります。
Oracle9iにはパスワードの有効期限機能があり、データベース管理者はこれを使用して、ユーザーがパスワードを定期的に変更するように強制できます。PwdChgDlg属性は、パスワードの期限切れが原因でログオンできないときに、パスワード変更ダイアログ・ボックスの表示を有効化または無効化します。有効にした場合、プロバイダは、パスワードを変更するためのダイアログ・ボックスを表示します。無効にした場合は、ログオンが失敗し、エラー・メッセージが表示されます。有効値は0 (無効)および1 (有効)です。デフォルトは1(有効)です。パスワードの有効期限機能の詳細は、『Oracle Database管理者ガイド』を参照してください。
次の例で、OraOLEDBおよびADOによるOracle Databaseへの接続方法を示します。
|
注意: Data Source、User IDおよびPasswordがOpenメソッドで指定されている場合、ADOはそれらのConnectionString属性を無視します。 |
ConnectionStringを使用して接続
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=MyOraDb;" & _
"User ID=scott;Password=tiger;"
con.Open
ConnectionStringを使用しないで接続
Dim con As New ADODB.Connection con.Provider = "OraOLEDB.Oracle" con.Open "MyOraDb", "scott", "tiger"
接続してプロバイダ固有の属性を設定
Dim con As New ADODB.Connection
con.Provider = "OraOLEDB.Oracle"
con.ConnectionString = "FetchSize=200;CacheType=Memory;" & _
"OSAuthent=0;PLSQLRSet=1;Data Source=MyOraDb;" & _
"User ID=scott;Password=tiger;"
con.Open
ユーザーIDに「/」を設定するオペレーティング・システム認証接続
Dim con As New ADODB.Connection con.Provider = "OraOLEDB.Oracle" con.Open "MyOraDb", "/", ""
OSAuthentを使用するオペレーティング・システム認証接続
Dim con As New ADODB.Connection con.Provider = "OraOLEDB.Oracle" con.ConnectionString = "Data Source=MyOraDb;OSAuthent=1;" con.Open
VCharNull属性は、ストアド・プロシージャで、VARCHAR2 OUTパラメータのヌル文字での終了を有効または無効にします。有効値は0(使用不可)と1(使用可能)です。デフォルトは1で、VARCHAR2 OUTパラメータがヌル文字で終了することを示します。値0は、VARCHAR2 OUTパラメータに空白が埋め込まれることを示します。
この属性のデフォルト値は、\\HKEY_LOCAL_ MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下にあり、このHOMENAMEはOracleホームです。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。
この接続属性を有効にした場合、アプリケーションでストアド・プロシージャのINパラメータとIN OUT CHARパラメータをWHERE句で使用するときは、パラメータに明示的に空白を埋め込む必要があります。
SPPrmDefVal属性は、アプリケーションでストアド・プロシージャのパラメータ値が指定されていない場合に、デフォルト値とNULL値のどちらを使用するかを指定します。有効値は0(FALSE)と1(TRUE)です。デフォルトはFALSEで、OraOLEDBでNULL値を渡すことができます。値がTRUEであれば、OraOLEDBでデフォルト値が使用されます。
この属性のデフォルト値は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下にあります。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。
OraOLEDBセッション・オブジェクトは、Oracle Databaseへの単一の接続を表します。セッション・オブジェクトは、データにアクセスして操作できるようにするインタフェースを公開します。
初期化データソースに作成される最初のセッションは、IDBInitialize::Initialize()で確立された初期接続を継承します。作成される後続のセッションは、データソース・プロパティで指定された特定のOracle Databaseへの、それぞれ個別の接続を確立します。
各セッション・オブジェクトもまた、データソースのトランザクション領域を定義します。特定のセッション・オブジェクトから作成されるすべてのコマンド・オブジェクトおよび行セット・オブジェクトは、そのセッションのトランザクションの一部になります。
そのセッション・オブジェクトへのすべての参照が解放されると、セッション・オブジェクトはメモリーから削除され、接続は切断されます。
OraOLEDBは、トランザクション操作の明示的なコミットと異常終了を行う、ローカル・トランザクションおよび分散トランザクションをサポートします。
OraOLEDBでは、ネストしたトランザクションはサポートしません。さらに、現在分散トランザクションに登録されているセッションでは、ローカル・トランザクションを起動できません。逆も同様で、現在ローカル・トランザクションに登録されているセッションでは、分散トランザクションを起動できません。
OraOLEDBは、明示的トランザクションのためのITransactionLocalインタフェースをサポートします。デフォルトでは、OraOLEDBは自動コミット・モードで、データベース上で終了した各処理は自動的または暗黙的にコミットされます。ITransactionLocalインタフェースを使用すると、コンシューマは明示的に特定のセッションに対するトランザクションを起動できるようになり、コンシューマが明示的に各処理をコミットまたは異常終了できるようになります。
OraOLEDBは、コミット読取り(カーソル・スタビリティ)分離レベルをサポートします。このレベルでは、別のトランザクションによる変更は、そのトランザクションがコミットされるまで参照できなくなります。
OraOLEDBコンシューマを、Microsoft Transaction Server(またはCOM+)トランザクションに登録する、またはMicrosoft分散トランザクション・コーディネータ(MS DTC)によって調整された分散トランザクションに登録するには、Oracle Services for Microsoft Transaction Server(MTS)リリース10.2以上をインストールする必要があります。Oracle Services for MTSの設定および構成の詳細は、『Oracle Services for Microsoft Transaction Server開発者ガイド』を参照してください。
ITransactionJoin::JoinTransaction()がコールされると、OraOLEDBはIsoLevel、IsoFlagsおよびpOtherOptionsの各パラメータを無視します。コンシューマがITransactionDispenser::BeginTransaction()メソッドをコールしてMS DTCからトランザクション・オブジェクトを取得する場合は、これらのオプションが必要です。
ただし、IsoFlagsが0でない場合は、XACT_E_NOISORETAINが返されます。
OraOLEDBは、Oracle DatabaseによってサポートされるANSI SQLと、ODBC SQL構文をサポートします。
コマンドを使用してOracle PL/SQL ストアド・プロシージャを実行する場合、コマンドで、次のようにOracle固有の構文またはODBCプロシージャ・コールのエスケープ・シーケンスを使用します。
Oracle固有の構文: BEGIN credit_account(123, 40); END;
ODBC構文: {CALL credit_account(123, 40)}
Oracle ANSI SQLを使用する場合は、コマンド内のパラメータの前にコロンを付けます。ODBC SQLの場合は、パラメータに疑問符(?)を付けます。
OraOLEDBは、PL/SQLのストアド・プロシージャおよびストアド・ファンクションの入力、出力および入出力パラメータをサポートします。OraOLEDBは、SQL文の入力パラメータをサポートします。
|
注意: OraOLEDBは、位置バインドのみをサポートします。 |
コマンドのためのOraOLEDBカスタム・プロパティは、カスタム・プロパティ・セットORAPROPSET_COMMANDSの下にグループ化されます。次のプロパティを提供します。
表2-1 コマンドのためのカスタム・プロパティ
| Visual Basicユーザーの場合 | C++ユーザーの場合 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
このプロパティは、PLSQLRSet接続文字列属性と同様です。
このプロパティは、OraOLEDBがPL/SQLストアド・プロシージャから行セットを返す必要があるかどうかを指定します。コンシューマから提供されたストアド・プロシージャが行セットを返す場合は、PLSQLRSetをTRUE(使用可能)に設定する必要があります。このプロパティは、コマンドが実行された後はFALSEに設定する必要があります。デフォルトでは、このプロパティはFALSE(使用不可)に設定されます。
プロパティは、セッションではなくコマンド・オブジェクトで設定できるので、コンシューマは、属性よりプロパティを優先的に使用する必要があります。コマンド・オブジェクトで設定することにより、コンシューマは、行セットを返すストアド・プロシージャを実行するコマンド・オブジェクトに対してのみプロパティを設定することができます。属性の場合、コンシューマは、ADOアプリケーションによって実行される多くのストアド・プロシージャの1つのみが行セットを返した場合でも、属性を設定する必要があります。このプロパティを使用すると、以前に属性を使用していたアプリケーションのパフォーマンスを向上させることができます。
例: カスタム・プロパティPLSQLRSetの設定
Dim objRes As NEW ADODB.Recordset
Dim objCon As NEW ADODB.Connection
Dim objCmd As NEW ADODB.Command
....
objCmd.ActiveConnection = objCon
objCmd.CommandType = adCmdText
' Enabling the PLSQLRSet property indicates to the provider
' that the command returns one or more rowsets
objCmd.Properties("PLSQLRSet") = TRUE
' Assume Employees.GetEmpRecords() has a REF CURSOR as
' one of the arguments
objCmd.CommandText = "{ CALL Employees.GetEmpRecords(?,?) }"
' Execute the SQL
set objRes = objCmd.Execute
' It is a good idea to disable the property after execute as the
' same command object may be used for a different SQL statement
objCmd.Properties("PLSQLRSet") = FALSE
このプロパティを使用すると、コンシューマは、コマンドにバインドされているいずれかのパラメータがOracleのNデータ型(NCHAR、NVARCHARまたはNCLOB)かどうかを指定できます。この情報は、OraOLEDBがパラメータを検出およびバインドするために必要です。このプロパティは、SELECT文を実行するコマンドには設定しないでください。ただし、このプロパティはINSERT、UPDATE、DELETEなど、その他すべてのSQL文には設定する必要があります。
このプロパティを設定すると、データベースへの少なくとも1回のラウンドトリップという処理オーバーヘッドが課されるので、このプロパティの使用はNデータ型のパラメータを含むSQL文に限定する必要があります。デフォルトでは、このプロパティはFALSEに設定されています。
|
注意: OraOLEDBは、SQL文のWHERE句内ではNデータ型のパラメータをサポートしません。 |
|
注意: コンシューマは、ODBCプロシージャ・コールのエスケープ・シーケンスを使用して、Nデータ型パラメータを持つストアド・プロシージャまたはファンクションをコールする必要があります。 |
例: カスタム・プロパティNDatatypeの設定
Dim objCon As NEW ADODB.Connection
Dim objCmd As NEW ADODB.Command
Dim prEmpno As NEW ADODB.Parameter
Dim prEname As NEW ADODB.Parameter
...
objCmd.ActiveConnection = objCon
objCmd.CommandType = adCmdText
' Create and append the parameters to the command object
Set prEmpno = objCmd.CreateParameter("prEmpno", adSmallInt, adParamInput, ,8521)
' prEname is bound to a NVARCHAR column in the EMP table
Set prEname = objCmd.CreateParameter("prEname", adBSTR, adParamInput, , "Joe")
objCmd.Parameters.Append prEmpno
objCmd.Parameters.Append prEname
' Enabling the NDatatype property indicates to the provider
' that one or more of the bound parameters is of N datatype
objCmd.Properties("NDatatype") = TRUE
' Assume column ENAME in table EMP is of NVARCHAR type
objCmd.CommandText = "INSERT INTO EMP (EMPNO, ENAME) VALUES (?, ?)"
' Execute the SQL
objCmd.Execute
' It is a good idea to disable the property after execute as the same command ' object may be used for a different SQL statement
objCmd.Properties("NDatatype") = FALSE
このプロパティを使用すると、コンシューマは、ストアド・プロシージャにバインドされているパラメータの1つ以上がOracleのLOBデータ型(CLOB、BLOBまたはNCLOB)かどうかを指定できます。OraOLEDBでは、ストアド・プロシージャを実行する前にそのパラメータ・リストをフェッチするために、このプロパティをTRUEに設定する必要があります。このプロパティを使用すると、1つ以上のLOBデータ型パラメータを持つストアド・プロシージャの処理オーバーヘッドが制限されます。このプロパティは、コマンドが実行された後はFALSEに設定する必要があります。デフォルトでは、このプロパティはFALSEに設定されています。
|
注意: コンシューマは、ODBCプロシージャ・コールのエスケープ・シーケンスを使用して、LOBデータ型パラメータを持つストアド・プロシージャまたはストアド・ファンクションをコールする必要があります。 |
例: カスタム・プロパティSPPrmsLOBの設定
Dim objCon As NEW ADODB.Connection
Dim objCmd As NEW ADODB.Command
Dim prCLOB As NEW ADODB.Parameter
...
objCmd.ActiveConnection = objCon
objCmd.CommandType = adCmdText
' Create and append the parameters to the command object
Set prCLOB = objCmd.CreateParameter("prCLOB", adLongVarchar, adParamOutput, _ 10000)
objCmd.Parameters.Append prCLOB
' Enabling the SPPrmsLOB property indicates to the provider
' that one or more of the bound parameters is of LOB data type
objCmd.Properties("SPPrmsLOB") = TRUE
' Assume the Stored Procedure requires a CLOB parameter
objCmd.CommandText = "{ call storedproc(?) }"
'Execute the SQL
objCmd.Execute
' It is a good idea to disable the property after execute as the
' same command object may be used for a different SQL statement
objCmd.Properties("SPPrmsLOB") = FALSE
AddToStmtCache
このプロパティを使用すると、プロパティがTRUEに設定され、文のキャッシュが有効になっているときに、実行された文をコンシューマがキャッシュできます。文のキャッシュが無効になっているか、このプロパティがFALSEに設定されていると、実行された文はキャッシュされません。
文のキャッシュが無効の場合、このプロパティは無視されます。文のキャッシュを有効にするには、StmtCacheSize接続文字列属性を0よりも大きい値に設定します。このプロパティを使用すると、文のキャッシュが有効な場合に、文を選択してキャッシュに追加することができます。デフォルトでは、このプロパティはTRUEに設定されています。
例: カスタム・プロパティAddToStmtCacheの設定
Dim objCon As NEW ADODB.Connection
Dim objCmd As NEW ADODB.Command
...
' Statement caching is enabled by setting the 'StmtCacheSize'
' connection string attribute to a value greater than zero
objCon.ConnectionString = "StmtCacheSize=10;Data Source=MyOraDb;" & _ "User ID=scott;Password=tiger;"
objCon.Open
objCmd.ActiveConnection = objCon
objCmd.CommandType = adCmdText
objCmd.CommandText = "SELECT * FROM EMP"
' "SELECT * FROM EMP" statement would be added to the statement cache because
' StmtCacheSize connection string attribute value is greater than 0 and
' AddToStmtCache property value is TRUE by default.
objCmd.Execute
' Do not add "SELECT * FROM DEPT" to the statement cache
objCmd.CommandText = "SELECT * FROM DEPT"
objCmd.Properties("AddToStmtCache") = FALSE
' "SELECT * FROM DEPT" statement would not be added to the statement cache
objCmd.Execute
Oracle Provider for OLE DBでは、コンシューマは、REF CURSOR型の引数を持つPL/SQLストアド・プロシージャまたはREF CURSOR値を返すストアド・ファンクションを実行できます。
OraOLEDBはREF CURSORバインド変数に対して行セットを返します。OLE DBの仕様にはREF CURSORのデータ型が定義されていないため、コンシューマはこのパラメータをバインドできません。
PL/SQLストアド・プロシージャにREF CURSOR型の引数が1つ以上ある場合、OraOLEDBはそれらの引数をバインドし、REF CURSOR型の各引数に対して行セットを返します。
PL/SQLストアド・ファンクションがREF CURSORを返す場合、またはREF CURSOR型の引数を持つ場合、OraOLEDBはそれらの引数をバインドし、各REF CURSOR型に対して行セットを返します。
この機能を使用するには、ODBCプロシージャ・コールのエスケープ・シーケンスでストアド・プロシージャまたはストアド・ファンクションをコールする必要があります。
コールされるストアド・プロシージャまたはストアド・ファンクションは、スタンドアロンまたはパッケージのどちらでも構いません。ただし、返されるREF CURSORは、データベース内のパッケージで明示的に定義されている必要があります。
OraOLEDBは、ストアド・プロシージャから複数の行セットを返す機能をサポートしています。コンシューマは、この機能を使用して、ストアド・プロシージャから返されたすべてのREF CURSORにアクセスできます。
PL/SQLのパッケージ
CREATE OR REPLACE PACKAGE Employees AS
TYPE empcur IS REF CURSOR;
PROCEDURE GetEmpRecords(p_cursor OUT empcur,
q_cursor OUT empcur,
indeptno IN NUMBER,
p_errorcode OUT NUMBER);
FUNCTION GetDept(inempno IN NUMBER,
p_errorcode OUT NUMBER)
RETURN empcur;
END Employees;
CREATE OR REPLACE PACKAGE BODY Employees AS
PROCEDURE GetEmpRecords(p_cursor OUT empcur,
q_cursor OUT empcur,
indeptno IN NUMBER,
p_errorcode OUT NUMBER) IS
BEGIN
p_errorcode := 0;
OPEN p_cursor FOR
SELECT *
FROM emp
WHERE deptno = indeptno
ORDER BY empno;
OPEN q_cursor FOR
SELECT empno
FROM emp
WHERE deptno = indeptno
ORDER BY empno;
EXCEPTION
WHEN OTHERS THEN
p_errorcode:= SQLCODE;
END GetEmpRecords;
FUNCTION GetDept(inempno IN NUMBER,
p_errorcode OUT NUMBER)
RETURN empcur IS
p_cursor empcur;
BEGIN
p_errorcode := 0;
OPEN p_cursor FOR
SELECT deptno
FROM emp
WHERE empno = inempno;
RETURN (p_cursor);
EXCEPTION
WHEN OTHERS THEN
p_errorcode:= SQLCODE;
END GetDept;
END Employees;
Dim Con As New ADODB.Connection
Dim Rst1 As New ADODB.Recordset
Dim Rst2 As New ADODB.Recordset
Dim Rst3 As New ADODB.Recordset
Dim Cmd As New ADODB.Command
Dim Prm1 As New ADODB.Parameter
Dim Prm2 As New ADODB.Parameter
Con.Provider = "OraOLEDB.Oracle"
Con.ConnectionString = "Data Source=MyOraDb;" & _
"User ID=scott;Password=tiger;"
Con.Open
Cmd.ActiveConnection = Con
' Although Employees.GetEmpRecords() takes four parameters, only
' two need to be bound because Ref cursor parameters are automatically
' bound by the provider.
Set Prm1 = Cmd.CreateParameter("Prm1", adSmallInt, adParamInput, , 30)
Cmd.Parameters.Append Prm1
Set Prm2 = Cmd.CreateParameter("Prm2", adSmallInt, adParamOutput)
Cmd.Parameters.Append Prm2
' Enable PLSQLRSet property
Cmd.Properties ("PLSQLRSet") = TRUE
' Stored Procedures returning resultsets must be called using the
' ODBC escape sequence for calling stored procedures.
Cmd.CommandText = "{CALL Employees.GetEmpRecords(?, ?)}"
' Get the first recordset
Set Rst1 = Cmd.Execute
' Disable PLSQLRSet property
Cmd.Properties("PLSQLRSet") = FALSE
' Get the second recordset
Set Rst2 = Rst1.NextRecordset
' Just as in a stored procedure, the REF CURSOR return value must
' not be bound in a stored function.
Prm1.Value = 7839
Prm2.Value = 0
' Enable PLSQLRSet property
Cmd.Properties("PLSQLRSet") = TRUE
' Stored Functions returning resultsets must be called using the
' ODBC escape sequence for calling stored functions.
Cmd.CommandText = "{CALL Employees.GetDept(?, ?)}"
' Get the rowset
Set Rst3 = Cmd.Execute
' Disable PLSQLRSet
Cmd.Properties ("PLSQLRSet") = FALSE
' Clean up
Rst1.Close
Rst2.Close
Rst3.Close
文のキャッシュにより、SQLまたはPL/SQL文の最初の実行時に作成されたサーバー・カーソルがキャッシュされるため、実行前に各文を解析する必要がなくなります。同じ文を後で実行するときは、解析した情報をカーソルから再利用して再解析せずに文を実行することができ、パフォーマンスが向上します。
文のキャッシュによるパフォーマンスの向上を確認するには、繰り返して実行される文のみをキャッシュすることをお薦めします。また、SQLまたはPL/SQL文ではリテラル値ではなくパラメータを使用してください。このようにすると、文のキャッシュを最大限に活用できます。パラメータを含む文の解析情報は、後続の実行でパラメータ値が変わっても再利用できるためです。一方、文のリテラル値が異なる場合は、後続の文で同じリテラル値が使用されないかぎり、解析情報を再利用できません。
StmtCacheSize接続文字列属性
この属性は、OraOLEDB文のキャッシングを有効化または無効化します。デフォルトでは、この属性は10(有効)に設定されます。0より大きい値に設定した場合、OraOLEDB文のキャッシングが有効になり、この値は接続用にキャッシュできる文の最大数を指定します。
1つの接続について指定の最大キャッシュ・サイズまでキャッシュされると、最近使用されていなかったカーソルが解放されて、新たに作成されたカーソルをキャッシュするための領域が空けられます。この値は、init.oraデータベース構成ファイルで設定されたOPEN_CURSORSパラメータの値以下に設定してください。
AddToStmtCacheコマンドのプロパティ
このプロパティは、文のキャッシュが有効な場合にのみ関係があります。文のキャッシュが有効な場合に、このプロパティがtrue(デフォルト)に設定されると、実行時に文がキャッシュに追加されます。文のキャッシュが無効になっているか、このプロパティがfalseに設定されていると、実行された文はキャッシュされません。
レジストリを使用した文のキャッシュの有効化
システムで実行するすべてのOraOLEDBアプリケーションについて、アプリケーションを変更せずに、文のキャッシュをデフォルトで有効にするには、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDB\StmtCacheSizeのレジストリ・キーを0よりも大きい値に設定します。このHOMENAMEは適切なOracleホームです。この値によって、サーバーにキャッシュされるカーソルの数が指定されます。デフォルトでは、これは10に設定されています。
接続と文のキャッシュ
文のキャッシュは、各接続で個別に管理されます。このため、同じ文を別の接続で実行するときは、接続ごとに文を1回解析して個別のカーソルをキャッシュする必要があります。
この機能は、SELECT文の最初の実行時にメタデータをキャッシュすることで、文のメタデータの取得を最小限に抑えます。その後に実行された同じ文は、キャッシュされたメタデータ情報を再利用して、パフォーマンスを向上させることができます。メタデータのキャッシュによるパフォーマンスの向上を確認するには、繰り返して実行される文のみをキャッシュすることをお薦めします。
|
注意: メタデータのキャッシュは、各接続で個別に管理されます。そのため、同じ文を異なる接続で実行するには、メタデータを接続ごとに1回キャッシュする必要があります。 |
Cancelメソッドは、現在実行中のOraOLEDBコマンドを取り消します。このメソッドは、ネットワーク通信量やサーバーの使用負荷が高い時間帯に、アプリケーションで実行時間の長いコマンドを取り消す必要がある場合に有用です。
あるいは、開発者はCommandTimeoutプロパティを使用して、OraOLEDBでコマンドの取消しが試行されるまでの、コマンドの実行時間の制限を設定できます。OraOLEDBでCommandTimeoutを有効にするには、EnableCmdTimeoutレジストリ値を1に設定する必要があります。
OLE DBを使用する場合、デフォルトのDPBROP_COMMANDTIMEOUTは0秒です。ADOを使用する場合、デフォルトのCommandTimeoutプロパティは30秒です。
OraOLEDBリリース11.1.0.7.20以降、インストール時に、デフォルト値が0に設定されたEnableCmdTimeoutというレジストリ値が追加されます。これを0に設定するとコマンド・タイムアウトが無効になり、1に設定すると有効になります。CommandTimeoutプロパティ値の設定は、EnableCmdTimeoutが1に設定されている場合にのみ有効になります。
レジストリ値は次のようになります。
\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDB\EnableCmdTimeout
ここでは、OraOLEDBで行セットを使用する方法を説明します。
OraOLEDBは、行セットを作成するIOpenRowset::OpenRowsetおよびICommand::Executeをサポートします。
IOpenRowset::OpenRowsetによる行セットの作成
IOpenRowset::OpenRowsetを使用する場合は、次のガイドラインに従ってください。
pTableIDパラメータには、実表またはビューを指定するDBID構造体が含まれている必要があります。
DBID構造体のeKindメンバーには、DBKIND_GUID_NAME、DBKIND_NAMEまたはDBKIND_PGUID_NAMEを設定する必要があります。
DBID構造体のuNameメンバーには、実表またはビューの名前をUnicode文字列で指定する必要があります。これはNULLにはできません。
OpenRowsetのpIndexIDパラメータにはNULLを設定する必要があります。
OraOLEDBは、行セットを返すSQLのSELECT文をサポートします。また、OraOLEDBは、PL/SQLのストアド・プロシージャおよびストアド・ファンクションから行セットを返す機能をサポートします。
デフォルトでは、ADOはコマンド・オブジェクトから更新不可の行セットを作成します。更新可能の行セットは、コマンド・オブジェクトでUpdatabilityおよびIRowsetChangeの2つのプロパティを設定することで、作成できます。Updatabilityプロパティには、次の値を設定できます。
次のADOコードのサンプルでは、コマンド・オブジェクトのUpdatabilityプロパティに、行セット・オブジェクトに対する挿入、削除および更新の各操作ができるよう値を設定します。
Dim Cmd As New ADODB.Command
Dim Rst As New ADODB.Recordset
Dim Con As New ADODB.Connection
...
Cmd.ActiveConnection = Con
Cmd.CommandText = "SELECT * FROM emp"
Cmd.CommandType = adCmdText
cmd.Properties("IRowsetChange") = TRUE
Cmd.Properties("Updatability") = 7
' creates an updatable rowset
Set Rst = cmd.Execute
OraOLEDBは、即時と遅延の両方の更新モードをサポートします。ただし、その操作によってLONG型、BLOB型またはCLOB型などの非スカラー列が変更されるような挿入および更新は、遅延モードでは実行できません。非スカラー列の値が遅延更新モードで変更された場合は、それが即時更新モードで操作されたかのように、その行全体がデータベースに転送されます。また、これらの操作はUndoメソッド(ADO)あるいはIRowsetUpdate::Undo()を使用しても取り消すことができません。ただし、トランザクション内の操作の場合は、RollbackTransメソッド(ADO)またはITransactionLocal::Abort()によってロールバックできます。
結合を含む問合せを使用して作成された行セットは、Client Cursor Engineが使用可能になっているOraOLEDBでのみ更新できます。C/C++ OLE DBコンシューマは、これらの行セットを更新可能にするにはこのサービスを使用可能にする必要があります。ADOコンシューマは、これらの行セットを更新可能にするにはadUseClientとしてCursorLocationを指定する必要があります。
次に例を示します。
Dim objCon As New ADODB.Connection
Dim objRst As New ADODB.Recordset
objCon.Provider = "OraOLEDB.Oracle"
objCon.Open "MyOraDb", "scott", "tiger"
objRst.CursorLocation = adUseClient 'ADO Client Cursor
objRst.Open "select ename, dname " & _
"from emp, dept " & _
"where emp.deptno = dept.deptno", _
objCon, adOpenStatic, adLockOptimistic, adCmdText
'Recordset created is updatable. Please note that CursorLocation
'needs to be explicitly set to adUseClient for this join recordset
'to be updatable.
OraOLEDBを使用してDBPROP_SERVERDATAONINSERT(Server Data on Insert)にTRUEが設定されていると、挿入および更新が行セットを通じて操作された場合、コンシューマは新たに挿入および更新された行からデフォルト値、順序値、およびトリガーされた列の値を取得できます。
DBPROP_SERVERDATAONINSERTがTRUEに設定されていると、OraOLEDBは新しく挿入または更新された行の行データをデータベースからフェッチするため、行セットを使用した挿入および更新の両方の操作でパフォーマンスが低下する可能性があります。ただし、DBPROP_SERVERDATAONINSERTがデフォルト値のFALSEに設定されている場合は、それらの行の列値がリクエストされたときに、挿入および更新操作で明示的に提供された値のみが返されます。
行セットを作成する元になっている実表には、デフォルト値、順序値およびトリガーによる値は含まれません。DBPROP_SERVERDATAONINSERTはデフォルト値のFALSEのままにしておくことを強くお薦めします。
DBPROP_SERVERDATAONINSERTプロパティは、コマンド・オブジェクトを使用した挿入および更新操作のパフォーマンスには影響しません。
OraOLEDBはCHAR型、DATE型、FLOAT型、NUMBER型、RAW型およびVARCHAR2型の列に対する検索のみをサポートします。それ以外の場合は、DB_E_NOTSUPPORTEDが返されます。
NULL値による検索を実行する場合は、DBCOMPAREOPS_EQ比較とDBCOMPAREOPS_NE比較の各操作のみがサポートされます。それ以外の場合は、DB_E_NOTSUPPORTEDが返されます。
行セットのパフォーマンスに影響を与えるOraOLEDB固有の接続文字列属性は、次のとおりです。
CacheType - プロバイダが行セット・データの格納に使用する、キャッシュのタイプを指定します。OraOLEDBには、次の2つのキャッシュ・メカニズムがあります。
Memory - プロバイダはすべての行セット・データをメモリー内に格納します。このキャッシュ・メカニズムによりパフォーマンスは向上しますが、メモリーの使用量はかなり多くなります。デフォルトはMemoryです。
File - プロバイダはすべての行セット・データをディスク上に格納します。このキャッシュ・メカニズムによりメモリーの消費量は制限されますが、パフォーマンスは低下します。
ChunkSize - この属性は、プロバイダのキャッシュでフェッチおよび格納される、LONG型およびLONG RAW型の列データのサイズをバイト数で指定します。この属性に大きな値を指定するとパフォーマンスが改善されますが、行セットにデータを格納するためにより多くのメモリーを必要とします。有効値は1から65535です。デフォルトは100です。
FetchSize: プロバイダが一度にフェッチする行数(フェッチ配列)を指定します。データ・サイズおよびネットワークの応答時間に基づいて設定する必要があります。この値の設定が高すぎる場合、問合せの実行時に待機時間が長くなることがあります。値の設定が低すぎる場合は、データベースへのラウンド・トリップが増える場合があります。有効値は、1から429、496および296です。デフォルトは100です。
DeferUpdChk - DeferUpdChk属性は、更新可能性チェックを遅らせるかどうかを指定します。これにより、ADOの読取り専用の非接続行セットの更新がサポートされます。有効値は0(FALSE)と1(TRUE)です。デフォルトはFALSEで、OraOLEDBがチェックを遅らせないことを意味します。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。
レジストリ内に、デフォルトの属性値が設定されています。詳細は、「デフォルトの属性値」を参照してください。次のADOコードは、デフォルトの属性値を上書きするサンプルです。
Dim con As ADODB.Connection
Set con = NEW ADODB.Connection
con.ConnectionString = "Provider=OraOLEDB.Oracle;User ID=scott;" & _
"Password=tiger;Data Source=MyOraDB;" & _
"FetchSize=200;CacheType=File;"
con.Open
ADO RowsetプロパティLockTypeのadLockPessimisticへの設定は、Oracle Provider for OLE DBではサポートされません。LockTypeがadLockPessimisticに設定されいる場合、OraOLEDBは、adLockOptimisticに設定されているときと同様の動作をします。この動作は、OraOLEDBが変更される行に対して明示的なロックを実行しないために発生します。ただし、新しいデータがデータベースに送信されると、別のユーザーによって行セット・データがすでに更新されていない場合にかぎり、データベースは更新を実行しますが、これは内容を保証しない書込みが許可されないことを意味します。LockType値のadLockReadOnly、adLockBatchOptimisticおよびadLockOptimisticがOraOLEDBでサポートされています。
ADO RowsetプロパティCursorTypeにadOpenKeysetまたはadOpenDynamicを設定しても、Oracle Provider for OLE DBではサポートされません。Oracleは文レベルの読取り一貫性をサポートすることで、問合せから返されるデータには、その問合せが実行された時点でコミット済のデータのみが含まれることが保証されるため、OraOLEDBは2つのどちらもサポートしません。CursorTypeの値としては、adOpenStaticおよびadOpenForwardOnlyがOraOLEDBによってサポートされています。
Oracle Provider for OLE DBで使用可能なスキーマ行セットは、次のとおりです。
DBSCHEMA_COLUMNS
DBSCHEMA_INDEXES
DBSCHEMA_SCHEMATA
DBSCHEMA_VIEWS
DBSCHEMA_TABLES
DBSCHEMA_PROVIDER_TYPES(前方スクロールのみ)
DBSCHEMA_FOREIGN_KEYS
DBSCHEMA_PRIMARY_KEYS
DBSCHEMA_PROCEDURES
DBSCHEMA_PROCEDURE_PARAMETERS
Oracleセッションの日付書式は、ALTER SESSION SET NLS_DATE_FORMATコマンドを使用しても設定できません。Visual Basicでは、日付書式はWindowsのコントロール パネルの「地域」設定で制御されます。Visual Basicの日付書式の詳細は、Visual Basicのドキュメントを参照してください。
Oracle Provider for OLE DBでは、ConnectionプロパティのUseSessionFormatがデフォルト値のFALSEに設定されている場合、セッションのNLS_DATE_FORMATが、プロバイダによって'YYYY-MM-DD HH24:MI:SS'に固定されています。日付を文字列としてOracle Databaseに渡す場合、'YYYY-MM-DD HH24:MI:SS'の形式にする必要があります。UseSessionFormatがTRUEに設定されている場合、NLS_DATE_FORMATはOracle Provider for OLE DBによって固定されず、デフォルト・セッションのNLS_DATE_FORMATが使用されます。次に例を示します。
SELECT * FROM EMP WHERE HIREDATE > '1981-06-15 17:32:12'
別の書式を使用するには、SQLファンクションTO_DATE()を使用して、文字列として渡される日付の書式を指定する必要があります。次に例を示します。
SELECT * FROM EMP WHERE HIREDATE > TO_DATE('15-JUN-81', 'DD-MON-YY')
ただし、パラメータとして渡される日付については、ADOが日付書式を制御するため、Windowsのコントロール パネルの「地域」設定によって制御されます。この場合は、TO_DATE()を使用しないでください。次に例を示します。
Private Sub Command1_Click()
Dim objCon As New ADODB.Connection
Dim objCmd As New ADODB.Command
Dim objRst As New ADODB.Recordset
Dim pDate As New ADODB.Parameter
objCon.Provider = "OraOLEDB.Oracle"
objCon.Open "MyOraDb", "scott", "tiger"
Set pDate = objCmd.CreateParameter("pDate", adDate, adParamInput)
objCmd.Parameters.Append pDate
objCmd.CommandText = _
"SELECT * FROM EMP WHERE HIREDATE > ?"
objCmd.ActiveConnection = objCon
objCmd.CommandType = adCmdText
pDate.Value = "06/15/1981"
Set objRst = objCmd.Execute
...
End Sub
Oracle Databaseのオブジェクト(表、列、ビューなど)の名前にはすべて、大文字と小文字の区別があります。このため、EMPとempという2つのオブジェクトを、データベースの同じ名前空間に置くことができます。
問合せSELECT ename FROM empは、表名がデータベース内でEMP(すべて大文字)であっても正しく実行されます。一方、大文字と小文字が混在したオブジェクト名を指定する場合は、二重引用符で名前を囲むことによって指定できます。次に例を示します。
SELECT ename FROM "Emp"
この例は、データベース内の表名がEmpの場合に正常に実行されます。二重引用符で囲むことにより、Oracle Databaseでオブジェクト名の大/小文字が区別されます。
ISequentialStreamインタフェースは、すべてのLONG、LONG RAWおよびLOB (BLOB、CLOB、NCLOBおよびBFILE)列でサポートされます。コンシューマはこのインタフェースを使用して、読取り専用のBFILEを除くすべてのLOB列に対して読取りおよび書込みを行えます。これらの列に対して読取りおよび書込みアクセスを行うには、行セットを作成するために使用するSELECT SQL文に結合を含めないでください。
|
注意: Oracle DatabaseのLOB型列のほとんどが最大4GBのデータ記憶域をサポートしますが、ADOの列サイズの最大値は2GBです。 |
BFILEデータ型を持つ列は、Rowsetインタフェースでは更新できません。ただし、更新が、BFILE列で示される外部ファイルのディレクトリと名前の変更に限定される場合は、コマンド・インタフェースを使用してこれらの列を更新できます。次に例を示します。
INSERT INTO topomaps (areanum, topomap)
VALUES (158, BFILENAME('mapdir', 'topo158.tps'))
LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。
OraOLEDBはUnicodeキャラクタ・セットをサポートします。コンシューマはこの機能を使用して、同じクライアント・コンピュータにある複数言語のデータにアクセスするためにOraOLEDBを使用できます。これは、Unicode標準で必要とされる数の言語をサポートするグローバル・インターネット・アプリケーションの作成に特に役立ちます。たとえば、Oracle9i Databaseにアクセスする単一のActive Server Page (ASP)アプリケーションを作成して、日本語、アラビア語、英語、タイ語などのコンテンツを動的に生成できます。
Oracle Databaseは、UnicodeのASCII互換のマルチバイト・エンコーディングであるUTF8コード体系でUnicodeデータを格納します。Microsoft Windows 2000は、2バイトの固定幅コード体系であるUCS2エンコーディングを使用します。OraOLEDBは、2つのコード体系間でデータを透過的に変換し、コンシューマがUCS2のみに対処できるようにします。
|
注意: Unicodeサポートは、ADOコンシューマに対して透過的です。CまたはC++を使用しているOLE DBコンシューマは、Unicodeデータが含まれている場合には、データ型バインドでDBTYPE_WSTRを明示的に指定する必要があります。 |
OraOLEDBは、Unicodeモードと非Unicodeモードの2つのモードで動作します。クライアントのキャラクタ・セットがサーバーのキャラクタ・セットのスーパーセットでない場合、またはデータベースのキャラクタ・セットがマルチバイト・キャラクタ・セットである場合、OraOLEDBは自動的にUnicodeモードを有効にします。このモードでは、OraOLEDBはUCS2コード体系でキャッシュ内にデータを格納します。ユーザーは、データの損失を防ぐために、データベースのキャラクタ・セットがUTF-8であることを確認する必要があります。
クライアントのキャラクタ・セットがサーバーのキャラクタ・セットのスーパーセットである場合、プロバイダは非Unicodeモードで動作します。このモードでは、UCS2エンコーディングで必要となる大規模な文字バッファを扱う必要がないため、パフォーマンスが多少向上します。
クライアントとサーバーのキャラクタ・セットの検出は、ログオン時に実行されます。
|
注意: OraOLEDBでは、Unicodeモードを有効にするためにクライアントのキャラクタ・セットをUTF-8に設定する必要はなくなりました。プロバイダは、現在もこのような設定をサポートしていますが、必須ではなくなりました。 |
詳細は、「行セットおよびパラメータのデータ型マッピング」を参照してください。
データの損失を防ぐために、データベースのキャラクタ・セットをUTF-8にする必要があります。これ以外に、Unicodeサポートで必須の設定はありません。
Oracle DatabaseがUTF-8キャラクタ・セットでデータを格納するように構成されていることを確認する必要があります。キャラクタ・セット構成は、通常はデータベースの作成時に指定します。データベースのキャラクタ・セット設定を確認するには、SQL*Plusで次の問合せを実行します。
SQL> SELECT parameter, value FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';
データベースのキャラクタ・セットがUTF-8でない場合は、UTF-8キャラクタ・セットで新規のデータベースを作成し、そこにデータをインポートする必要があります。詳細は、『Oracle Database管理者ガイド』を参照してください。
|
関連項目: 詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照 |
OLEオブジェクトおよびCOMオブジェクトは、オブジェクト・メンバー・ファンクションのHRESULTリターン・コードによってエラーを報告します。OLE/COMのHRESULTリターン・コードはビット圧縮された構造体です。OLEには構造体メンバーの参照を解除するマクロがあります。OraOLEDBは、エラーに関する情報を取り出すために、IErrorLookupを公開します。
すべてのオブジェクトは拡張エラー情報をサポートします。このため、コンシューマは、OLE DB拡張エラー・オブジェクトをインスタンス化し、続いてGetErrorDescription()メソッドをコールして、エラー・テキストを取得する必要があります。
// Instantiate OraOLEDBErrorLookup and obtain a pointer to its
// IErrorLookup interface
CoCreateInstance(CLSID_OraOLEDBErrorLookup, NULL, CLSCTX_INPROC_SERVER,
IID_IErrorLookup, (void **)&pIErrorLookup)
//Call the method GetErrorDescription() to get the full error text
pIErrorLookup->GetErrorDescription()
OraOLEDBプロバイダは、エラー全体を1つのテキスト・ブロックにスタックして返します。
ADOユーザーは、次のサンプルを参考にしてください。
Dim oerr As ADODB.Error
For Each oerr in con.Errors
MsgBox "Error: " & oerr.Description & vbCrLf _
& "Source: " & oerr.Source
Next
OLE DB .NETデータ・プロバイダは、Oracle DatabaseにアクセスするためのOLE DBプロバイダとしてOraOLEDBを利用できます。
OraOLEDBとOLE DB .NETデータ・プロバイダとの間に互換性を持たせるには、接続文字列属性OLEDB.NETをTrueに設定します。
OLEDB.NET属性をFalseに設定すると、.NETとの互換性が無効になります。
|
注意: OLEDB.NET接続文字列属性は、ADOアプリケーションでは使用しないでください。 |
OLE DB .NETデータ・プロバイダでOraOLEDBを使用する際に、OLEDB.NET接続属性は、次の例に示すようにTrueに設定する必要があります。
// in VB.NET Dim con As New OleDbConnection() con.ConnectionString = "Provider=OraOLEDB.Oracle;User Id=scott;" & _ "Password=tiger;Data Source=Oracle;OLEDB.NET=True;" con.Open // in C# ... OleDbConnection con = new OleDbConnection(); con.ConnectionString = "Provider=OraOLEDB.Oracle;User Id=scott;" + "Password=tiger;Data Source=Oracle;OLEDB.NET=true;" con.Open(); ...
ADOでは、OraOLEDBプロバイダ固有のプロパティをオブジェクト・レベルで設定できます。OraOLEDB固有のプロパティSPPrmsLOBおよびNDatatypeは、接続文字列属性としても、コマンド・オブジェクト・レベルでも設定できます。StmtCacheSizeプロパティは接続文字列属性として設定でき、AddToStmtCacheプロパティはコマンド・オブジェクト・レベルで設定できます。次の例では、コマンド・レベルでのプロパティの設定を示します。
// in VB
Dim cmd as new ADODB.Command
...
cmd.Properties("SPPrmsLOB") = True
cmd.Properties("NDatatype") = True
cmd.Properties("AddToStmtCache") = True
...
一方、OLEDB.NETデータ・プロバイダは、OLE DBプロバイダ固有のプロパティをオブジェクト・レベルで公開できません。したがって、OraOLEDBがOLE DB .NETデータ・プロバイダで使用される場合、SPPrmsLOBプロパティおよびNDatatypeプロパティは接続文字列属性としてのみ設定でき、AddToStmtCacheプロパティはサポートされません。
// in VB.NET
Dim con As New OleDbConnection()
con.ConnectionString = "Provider=OraOLEDB.Oracle;User Id=scott;" & _
"Password=tiger;Data Source=Oracle;OLEDB.NET=True;" & _
"SPPrmsLOB=False;NDatatype=False;"
con.Open()
SPPrmsLOBおよびNDatatype接続文字列属性が指定されていない場合は、デフォルトでFalseに設定されます。
これらの接続文字列属性をTrueに設定すると、パラメータ付きのコマンドを実行する際に、処理オーバーヘッドが増加します。このため、このどちらかの属性をTrueに設定する前に、「コマンドのためのOraOLEDBカスタム・プロパティ」を参照してください。
OleDbDataAdapter.Update()メソッドがDataTableで行われた変更でOracle Databaseを適切に更新するには、DataTableにデータベース表の主キーが含まれている必要があります。データベース表に主キーが含まれていない場合は、DataTableに移入する際にROWIDを明示的に選択して、データベース内の行の更新時にROWIDを使用して行を一意に識別できるようにする必要があります。
主キーを含むデータベース表でROWIDを選択しないでください。ROWIDが主キーとともに選択されている場合、ROWIDは主キーとしてマークされる唯一の列になります。
|
関連項目: OLE DB .NETデータ・プロバイダの使用方法の詳細は、次の資料を参照してください。
|
次の簡単なサンプルで、Visual Basic 6.0でADOとOracle Provider for OLE DBを使用してOracle Databaseに接続し、PL/SQLのストアド・プロシージャとストアド・ファンクションを実行する方法を説明します。
この例では、Oracle Databaseに、デモ用の表EMPとユーザー・アカウントscottが存在することを前提にしています。scottアカウントは、Oracleの初期データベースに含まれています。使用しているデータベースにこのアカウントがない場合は、サンプル・プログラムを実行する前にこのアカウントを作成してください。使用しているデータベースにemp表がない場合は、demobld.sqlスクリプトを使用してこのデモ用の表を作成できます。
また、このサンプルでは、Oracle Databaseに接続するときに、データベースのネットワーク別名としてexampledbを使用します。使用しているシステムに合わせて、このネットワーク別名を変更する必要があります。
SQL*Plusを起動します。
ユーザー名scottとパスワードtigerを使用して接続します。
SQL> @ORACLE_BASE\ORACLE_HOME\sqlplus\demo\demobld.sql;
scottアカウントでemp表を作成した後で、Visual Basicのサンプルで実行されるストアド・プロシージャとストアド・ファンクションを含むPL/SQLパッケージを作成する必要があります。
ユーザー名scottとパスワードtigerを使用して接続します。
「PL/SQLのパッケージ」で示した、PL/SQLパッケージを作成します。
|
注意: PL/SQLパッケージを作成するときには、/文字が終了記号として使用されます。各CREATE PACKAGE...ENDブロックに続く別の行に、この文字を追加する必要があります。 |
Oracle Databaseの設定が完了すると、Visual Basic 6.0プロジェクトを作成できます。
Visual Basic 6.0を起動して新しいプロジェクトを作成します。
プロジェクト参照として、Microsoft ActiveX Data Objects 2.1 LibraryおよびMicrosoft ActiveX Data Objects Recordset 2.1 Libraryが含まれていることを確認します。

フォームにコマンド・ボタンを2つ追加します。その1つは、PL/SQLプロシージャGetEmpRecordsを実行するコードを実行するためのボタンです。もう1つは、PL/SQLファンクションGetDeptを実行するコードを実行するためのボタンです。

PL/SQLプロシージャGetEmpRecordsを実行するコードを実行するためのボタンのClickサブルーチンに、次のコードを追加します。
Dim Oracon As ADODB.Connection
Dim recset As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim param1 As New ADODB.Parameter
Dim param2 As New ADODB.Parameter
Dim objErr As ADODB.Error
Dim Message, Title, Default, EmpNoValue
Message = "Enter an employee number (5000 - 9000)"
Title = "Choose an Employee"
Default = "7654"
On Error GoTo err_test
EmpNoValue = InputBox(Message, Title, Default)
If EmpNoValue = "" Then Exit Sub
If EmpNoValue < 5000 Or EmpNoValue > 9000 Then EmpNoValue = 7654
Set Oracon = CreateObject("ADODB.Connection")
Oracon.ConnectionString = "Provider=OraOLEDB.Oracle;" & _
"Data Source=exampledb;" & _
"User ID=scott;" & _
"Password=tiger;"
Oracon.Open
Set cmd.ActiveConnection = Oracon
Set param1 = cmd.CreateParameter("param1", adSmallInt, adParamInput, ,
EmpNoValue)
cmd.Parameters.Append param1
Set param2 = cmd.CreateParameter("param2", adSmallInt, adParamOutput)
cmd.Parameters.Append param2
' Enable PLSQLRSet property
Cmd.Properties ("PLSQLRSet") = TRUE
cmd.CommandText = "{CALL Employees.GetDept(?, ?)}"
Set recset = cmd.Execute
' Disable PLSQLRSet property
Cmd.Properties ("PLSQLRSet") = FALSE
MsgBox "Number: " & EmpNoValue & " Dept: " & recset.Fields("deptno").Value
Exit Sub
err_test:
MsgBox Error$
For Each objErr In Oracon.Errors
MsgBox objErr.Description
Next
Oracon.Errors.Clear
Resume Next
PL/SQLファンクションGetDeptを実行するコードを実行するためのボタンのClickサブルーチンに、次のコードを追加します。
Dim Oracon As ADODB.Connection
Dim recset As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim param1 As New ADODB.Parameter
Dim param2 As New ADODB.Parameter
Dim objErr As ADODB.Error
Dim Message, Title, Default, DeptValue
Message = "Enter a department number (10, 20, or 30)"
Title = "Choose a Department"
Default = "30"
On Error GoTo err_test
DeptValue = InputBox(Message, Title, Default)
If DeptValue = "" Then Exit Sub
If DeptValue < 10 Or DeptValue > 30 Then DeptValue = 30
Set Oracon = CreateObject("ADODB.Connection")
Oracon.ConnectionString = "Provider=OraOLEDB.Oracle;" & _
"Data Source=exampledb;" & _
"User ID=scott;" & _
"Password=tiger;"
Oracon.Open
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = Oracon
Set param1 = cmd.CreateParameter("param1", adSmallInt, adParamInput, ,
DeptValue)
cmd.Parameters.Append param1
Set param2 = cmd.CreateParameter("param2", adSmallInt, adParamOutput)
cmd.Parameters.Append param2
' Enable PLSQLRSet property
Cmd.Properties ("PLSQLRSet") = TRUE
cmd.CommandText = "{CALL Employees.GetEmpRecords(?, ?)}"
Set recset = cmd.Execute
' Disable PLSQLRSet property
Cmd.Properties ("PLSQLRSet") = FALSE
Do While Not recset.EOF
MsgBox "Number: " & recset.Fields("empno").Value & " Name: " &
recset.Fields("ename").Value & " Dept: " & recset.Fields("deptno").Value
recset.MoveNext
Loop
Exit Sub
err_test:
MsgBox Error$
For Each objErr In Oracon.Errors
MsgBox objErr.Description
Next
Oracon.Errors.Clear
Resume Next
プロジェクトを実行して結果を確認します。たとえば、「Get Employee Records by Dept」ボタンを選択すると、部門番号の入力を要求するダイアログ・ボックスが表示されます。

部門番号を入力して「OK」をクリックすると、別のダイアログ・ボックスに、その部門の従業員名と従業員番号が表示されます。
