ヘッダーをスキップ
Oracle® Provider for OLE DB開発者ガイド
11gリリース2 (11.2) for Microsoft Windows
B58886-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

2 OraOLEDBの機能

この章では、Oracle Provider for OLE DB(OraOLEDB)のコンポーネントについて、およびこれらのコンポーネントを使用してOLE DBコンシューマ・アプリケーションを開発する方法について説明します。

この章の項目は次のとおりです。

OraOLEDBプロバイダ固有の機能

次の各項で、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はオペレーティング・システムの地域オプションのクライアント・タイムゾーン設定を使用します)。TIMESTAMPfractional_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)

Visual Basicの例

 

...
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_AUTH_USERNAMEにユーザーID(scottなど)を設定します。

  • DBPROP_AUTH_PASSWORDにパスワード(tigerなど)を設定します。

  • DBPROP_INIT_DATASOURCEにネット・サービス名(myOraDbなど)を設定します。

また、コンシューマは、DBPROP_INIT_PROMPTDBPROMPT_PROMPTを使用できます。これを使用すると、プロバイダがログオン・ボックスを表示するので、ユーザーは接続情報を入力できるようになります。

DBPROMPT_NOPROMPTを使用すると、ログオン・ボックスの表示ができなくなります。この場合は、ログオン情報が不完全なために、プロバイダはログオン・エラーを返します。ただし、このプロパティにDBPROMPT_COMPLETEまたはDBPROMPT_COMPLETEREQUIREDが設定されている場合は、ログオン情報が不完全な場合にのみログオン・ボックスが表示されます。

OLE DBサービスとの互換性

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では、OLE DBサービスが自動的に有効になります。このため、ADOアプリケーションでOLEDBサービスを使用するために特別なコードは必要ありません。

C++/COMアプリケーションでのOLE DBサービス

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();

Oracle Databaseへの接続

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固有の接続文字列属性

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データ型かどうかを指定しますが、これには、NCHARNVARCHARまたはNCLOBが含まれます。「NDatatype」を参照してください。

    この接続属性は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下に表示されないので注意してください。

  • SPPrmsLOB: ストアド・プロシージャにバインドされている1つ以上のパラメータがLOBデータ型かどうかを指定しますが、これには、CLOBBLOBまたは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クライアントは、次のいずれかを設定することでこの機能を使用できるようになります。

  • DBPROP_AUTH_USERNAME/に設定

  • DBPROP_INIT_PROVIDERSTRINGOSAuthent=1に設定

  • レジストリのOSAuthent1に設定

パスワードの期限

Oracle9iにはパスワードの有効期限機能があり、データベース管理者はこれを使用して、ユーザーがパスワードを定期的に変更するように強制できます。PwdChgDlg属性は、パスワードの期限切れが原因でログオンできないときに、パスワード変更ダイアログ・ボックスの表示を有効化または無効化します。有効にした場合、プロバイダは、パスワードを変更するためのダイアログ・ボックスを表示します。無効にした場合は、ログオンが失敗し、エラー・メッセージが表示されます。有効値は0 (無効)および1 (有効)です。デフォルトは1(有効)です。パスワードの有効期限機能の詳細は、『Oracle Database管理者ガイド』を参照してください。

例: ADOによるOracle Databaseへの接続

次の例で、OraOLEDBおよびADOによるOracle Databaseへの接続方法を示します。


注意:

Data SourceUser IDおよびPasswordOpenメソッドで指定されている場合、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

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

SPPrmDefVal属性は、アプリケーションでストアド・プロシージャのパラメータ値が指定されていない場合に、デフォルト値とNULL値のどちらを使用するかを指定します。有効値は0(FALSE)と1(TRUE)です。デフォルトはFALSEで、OraOLEDBでNULL値を渡すことができます。値がTRUEであれば、OraOLEDBでデフォルト値が使用されます。

この属性のデフォルト値は、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDBレジストリ・キーの下にあります。この属性が接続時に指定されない場合、デフォルトのレジストリ値が使用されます。

OraOLEDBセッション

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はIsoLevelIsoFlagsおよび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)}

コマンドの準備

OraOLEDBは、SQLのSELECT文の場合にのみ、メタデータの妥当性をチェックして取り出します。

コマンド・パラメータ

Oracle ANSI SQLを使用する場合は、コマンド内のパラメータの前にコロンを付けます。ODBC SQLの場合は、パラメータに疑問符(?)を付けます。

OraOLEDBは、PL/SQLのストアド・プロシージャおよびストアド・ファンクションの入力、出力および入出力パラメータをサポートします。OraOLEDBは、SQL文の入力パラメータをサポートします。


注意:

OraOLEDBは、位置バインドのみをサポートします。

コマンドのためのOraOLEDBカスタム・プロパティ

コマンドのためのOraOLEDBカスタム・プロパティは、カスタム・プロパティ・セットORAPROPSET_COMMANDSの下にグループ化されます。次のプロパティを提供します。

表2-1 コマンドのためのカスタム・プロパティ

Visual Basicユーザーの場合 C++ユーザーの場合

PLSQLRSet

ORAPROP_PLSQLRSet

NDatatype

ORAPROP_NDatatype

SPPrmsLOB

ORAPROP_SPPrmsLOB

AddToStmtCache

ORAPROP_AddToStmtCache


PLSQLRSet

このプロパティは、PLSQLRSet接続文字列属性と同様です。

このプロパティは、OraOLEDBがPL/SQLストアド・プロシージャから行セットを返す必要があるかどうかを指定します。コンシューマから提供されたストアド・プロシージャが行セットを返す場合は、PLSQLRSetTRUE(使用可能)に設定する必要があります。このプロパティは、コマンドが実行された後は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

NDatatype

このプロパティを使用すると、コンシューマは、コマンドにバインドされているいずれかのパラメータがOracleのNデータ型(NCHARNVARCHARまたはNCLOB)かどうかを指定できます。この情報は、OraOLEDBがパラメータを検出およびバインドするために必要です。このプロパティは、SELECT文を実行するコマンドには設定しないでください。ただし、このプロパティはINSERTUPDATEDELETEなど、その他すべての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

SPPrmsLOB

このプロパティを使用すると、コンシューマは、ストアド・プロシージャにバインドされているパラメータの1つ以上がOracleのLOBデータ型(CLOBBLOBまたは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; 

ADOプログラム

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回キャッシュする必要があります。

接続文字列属性を使用したメタデータのキャッシュの有効化

MetaDataCacheSize属性は、OraOLEDBメタデータ・キャッシングを有効化または無効化します。0より大きい値に設定した場合、OraOLEDBメタデータ・キャッシングが有効になり、この値はメタデータが接続用にキャッシュできる文の最大数を指定します。デフォルトでは、この属性は10に設定されています。

レジストリを使用したメタデータのキャッシュの有効化

システムで実行中のすべてのOraOLEDBアプリケーションについて、アプリケーションを変更することなく、メタデータのキャッシュをデフォルトで有効にするには、次のレジストリ・キーを0よりも大きい値に設定します。デフォルトでは、これは10に設定されています。

\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOMENAME\OLEDB\MetaDataCacheSize

コマンド・タイムアウトおよびCancelメソッド

Cancelメソッドは、現在実行中のOraOLEDBコマンドを取り消します。このメソッドは、ネットワーク通信量やサーバーの使用負荷が高い時間帯に、アプリケーションで実行時間の長いコマンドを取り消す必要がある場合に有用です。

あるいは、開発者はCommandTimeoutプロパティを使用して、OraOLEDBでコマンドの取消しが試行されるまでの、コマンドの実行時間の制限を設定できます。OraOLEDBでCommandTimeoutを有効にするには、EnableCmdTimeoutレジストリ値を1に設定する必要があります。

OLE DBを使用する場合、デフォルトのDPBROP_COMMANDTIMEOUT0秒です。ADOを使用する場合、デフォルトのCommandTimeoutプロパティは30秒です。

レジストリを使用したCommandTimeoutの有効化

OraOLEDBリリース11.1.0.7.20以降、インストール時に、デフォルト値が0に設定されたEnableCmdTimeoutというレジストリ値が追加されます。これを0に設定するとコマンド・タイムアウトが無効になり、1に設定すると有効になります。CommandTimeoutプロパティ値の設定は、EnableCmdTimeout1に設定されている場合にのみ有効になります。

レジストリ値は次のようになります。

\\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_NAMEDBKIND_NAMEまたはDBKIND_PGUID_NAMEを設定する必要があります。

  • DBID構造体のuNameメンバーには、実表またはビューの名前をUnicode文字列で指定する必要があります。これはNULLにはできません。

  • OpenRowsetpIndexIDパラメータにはNULLを設定する必要があります。

ICommand::Executeによる行セットの作成

OraOLEDBは、行セットを返すSQLのSELECT文をサポートします。また、OraOLEDBは、PL/SQLのストアド・プロシージャおよびストアド・ファンクションから行セットを返す機能をサポートします。

デフォルトでは、ADOはコマンド・オブジェクトから更新不可の行セットを作成します。更新可能の行セットは、コマンド・オブジェクトでUpdatabilityおよびIRowsetChangeの2つのプロパティを設定することで、作成できます。Updatabilityプロパティには、次の値を設定できます。

表2-2 Updatabilityプロパティに設定可能な値

説明

1

更新

2

削除

3

更新および削除

4

挿入

5

挿入および更新

6

挿入および削除

7

挿入、削除および更新


次の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.

Server Data on Insertプロパティ

OraOLEDBを使用してDBPROP_SERVERDATAONINSERT(Server Data on Insert)にTRUEが設定されていると、挿入および更新が行セットを通じて操作された場合、コンシューマは新たに挿入および更新された行からデフォルト値、順序値、およびトリガーされた列の値を取得できます。

DBPROP_SERVERDATAONINSERTTRUEに設定されていると、OraOLEDBは新しく挿入または更新された行の行データをデータベースからフェッチするため、行セットを使用した挿入および更新の両方の操作でパフォーマンスが低下する可能性があります。ただし、DBPROP_SERVERDATAONINSERTがデフォルト値のFALSEに設定されている場合は、それらの行の列値がリクエストされたときに、挿入および更新操作で明示的に提供された値のみが返されます。

行セットを作成する元になっている実表には、デフォルト値、順序値およびトリガーによる値は含まれません。DBPROP_SERVERDATAONINSERTはデフォルト値のFALSEのままにしておくことを強くお薦めします。

DBPROP_SERVERDATAONINSERTプロパティは、コマンド・オブジェクトを使用した挿入および更新操作のパフォーマンスには影響しません。

IRowsetFind::FindNextによる行の検索

OraOLEDBはCHAR型、DATE型、FLOAT型、NUMBER型、RAW型およびVARCHAR2型の列に対する検索のみをサポートします。それ以外の場合は、DB_E_NOTSUPPORTEDが返されます。

NULL値による検索を実行する場合は、DBCOMPAREOPS_EQ比較とDBCOMPAREOPS_NE比較の各操作のみがサポートされます。それ以外の場合は、DB_E_NOTSUPPORTEDが返されます。

行セットのためのOraOLEDB固有の接続文字列属性

行セットのパフォーマンスに影響を与えるOraOLEDB固有の接続文字列属性は、次のとおりです。

  • CacheType - プロバイダが行セット・データの格納に使用する、キャッシュのタイプを指定します。OraOLEDBには、次の2つのキャッシュ・メカニズムがあります。

    • Memory - プロバイダはすべての行セット・データをメモリー内に格納します。このキャッシュ・メカニズムによりパフォーマンスは向上しますが、メモリーの使用量はかなり多くなります。デフォルトはMemoryです。

    • File - プロバイダはすべての行セット・データをディスク上に格納します。このキャッシュ・メカニズムによりメモリーの消費量は制限されますが、パフォーマンスは低下します。

  • ChunkSize - この属性は、プロバイダのキャッシュでフェッチおよび格納される、LONG型およびLONG RAW型の列データのサイズをバイト数で指定します。この属性に大きな値を指定するとパフォーマンスが改善されますが、行セットにデータを格納するためにより多くのメモリーを必要とします。有効値は1から65535です。デフォルトは100です。

  • FetchSize: プロバイダが一度にフェッチする行数(フェッチ配列)を指定します。データ・サイズおよびネットワークの応答時間に基づいて設定する必要があります。この値の設定が高すぎる場合、問合せの実行時に待機時間が長くなることがあります。値の設定が低すぎる場合は、データベースへのラウンド・トリップが増える場合があります。有効値は、1から429496および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プログラマのためのヒント

ADO RowsetプロパティLockTypeadLockPessimisticへの設定は、Oracle Provider for OLE DBではサポートされません。LockTypeadLockPessimisticに設定されいる場合、OraOLEDBは、adLockOptimisticに設定されているときと同様の動作をします。この動作は、OraOLEDBが変更される行に対して明示的なロックを実行しないために発生します。ただし、新しいデータがデータベースに送信されると、別のユーザーによって行セット・データがすでに更新されていない場合にかぎり、データベースは更新を実行しますが、これは内容を保証しない書込みが許可されないことを意味します。LockType値のadLockReadOnlyadLockBatchOptimisticおよびadLockOptimisticがOraOLEDBでサポートされています。

ADO RowsetプロパティCursorTypeadOpenKeysetまたは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'の形式にする必要があります。UseSessionFormatTRUEに設定されている場合、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のオブジェクト(表、列、ビューなど)の名前にはすべて、大文字と小文字の区別があります。このため、EMPempという2つのオブジェクトを、データベースの同じ名前空間に置くことができます。

問合せSELECT ename FROM empは、表名がデータベース内でEMP(すべて大文字)であっても正しく実行されます。一方、大文字と小文字が混在したオブジェクト名を指定する場合は、二重引用符で名前を囲むことによって指定できます。次に例を示します。

SELECT ename FROM "Emp"

この例は、データベース内の表名がEmpの場合に正常に実行されます。二重引用符で囲むことにより、Oracle Databaseでオブジェクト名の大/小文字が区別されます。

LOBサポート

ISequentialStreamインタフェースは、すべてのLONGLONG RAWおよびLOB (BLOBCLOBNCLOBおよび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およびラージ・オブジェクト開発者ガイド』を参照してください。

Unicodeサポート

OraOLEDBはUnicodeキャラクタ・セットをサポートします。コンシューマはこの機能を使用して、同じクライアント・コンピュータにある複数言語のデータにアクセスするためにOraOLEDBを使用できます。これは、Unicode標準で必要とされる数の言語をサポートするグローバル・インターネット・アプリケーションの作成に特に役立ちます。たとえば、Oracle9i Databaseにアクセスする単一のActive Server Page (ASP)アプリケーションを作成して、日本語、アラビア語、英語、タイ語などのコンテンツを動的に生成できます。

Unicodeエンコーディングのタイプ

Oracle Databaseは、UnicodeのASCII互換のマルチバイト・エンコーディングであるUTF8コード体系でUnicodeデータを格納します。Microsoft Windows 2000は、2バイトの固定幅コード体系であるUCS2エンコーディングを使用します。OraOLEDBは、2つのコード体系間でデータを透過的に変換し、コンシューマがUCS2のみに対処できるようにします。


注意:

Unicodeサポートは、ADOコンシューマに対して透過的です。CまたはC++を使用しているOLE DBコンシューマは、Unicodeデータが含まれている場合には、データ型バインドでDBTYPE_WSTRを明示的に指定する必要があります。

Oracle Unicodeサポートの機能

OraOLEDBは、Unicodeモードと非Unicodeモードの2つのモードで動作します。クライアントのキャラクタ・セットがサーバーのキャラクタ・セットのスーパーセットでない場合、またはデータベースのキャラクタ・セットがマルチバイト・キャラクタ・セットである場合、OraOLEDBは自動的にUnicodeモードを有効にします。このモードでは、OraOLEDBはUCS2コード体系でキャッシュ内にデータを格納します。ユーザーは、データの損失を防ぐために、データベースのキャラクタ・セットがUTF-8であることを確認する必要があります。

クライアントのキャラクタ・セットがサーバーのキャラクタ・セットのスーパーセットである場合、プロバイダは非Unicodeモードで動作します。このモードでは、UCS2エンコーディングで必要となる大規模な文字バッファを扱う必要がないため、パフォーマンスが多少向上します。

クライアントとサーバーのキャラクタ・セットの検出は、ログオン時に実行されます。


注意:

OraOLEDBでは、Unicodeモードを有効にするためにクライアントのキャラクタ・セットをUTF-8に設定する必要はなくなりました。プロバイダは、現在もこのような設定をサポートしていますが、必須ではなくなりました。

詳細は、「行セットおよびパラメータのデータ型マッピング」を参照してください。

Unicodeサポートの設定

データの損失を防ぐために、データベースのキャラクタ・セットを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

OLEDB.NETデータ・プロバイダの互換性

OLE DB .NETデータ・プロバイダは、Oracle DatabaseにアクセスするためのOLE DBプロバイダとしてOraOLEDBを利用できます。

OraOLEDBとOLE DB .NETデータ・プロバイダとの間に互換性を持たせるには、接続文字列属性OLEDB.NETTrueに設定します。

OLEDB.NET属性をFalseに設定すると、.NETとの互換性が無効になります。


注意:

OLEDB.NET接続文字列属性は、ADOアプリケーションでは使用しないでください。

接続文字列でのOLEDB.NET属性の使用

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();
...

OraOLEDBカスタム・プロパティの使用

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カスタム・プロパティ」を参照してください。

DataTable変更でのOracleの更新

OleDbDataAdapter.Update()メソッドがDataTableで行われた変更でOracle Databaseを適切に更新するには、DataTableにデータベース表の主キーが含まれている必要があります。データベース表に主キーが含まれていない場合は、DataTableに移入する際にROWIDを明示的に選択して、データベース内の行の更新時にROWIDを使用して行を一意に識別できるようにする必要があります。

主キーを含むデータベース表でROWIDを選択しないでください。ROWIDが主キーとともに選択されている場合、ROWIDは主キーとしてマークされる唯一の列になります。


関連項目:

OLE DB .NETデータ・プロバイダの使用方法の詳細は、次の資料を参照してください。
  • Microsoft .NETドキュメント

  • Microsoft .NET Frameworkクラス・ライブラリ


Visual BasicでのOraOLEDBの使用

次の簡単なサンプルで、Visual Basic 6.0でADOとOracle Provider for OLE DBを使用してOracle Databaseに接続し、PL/SQLのストアド・プロシージャとストアド・ファンクションを実行する方法を説明します。

Oracle Databaseの設定

この例では、Oracle Databaseに、デモ用の表EMPとユーザー・アカウントscottが存在することを前提にしています。scottアカウントは、Oracleの初期データベースに含まれています。使用しているデータベースにこのアカウントがない場合は、サンプル・プログラムを実行する前にこのアカウントを作成してください。使用しているデータベースにemp表がない場合は、demobld.sqlスクリプトを使用してこのデモ用の表を作成できます。

また、このサンプルでは、Oracle Databaseに接続するときに、データベースのネットワーク別名としてexampledbを使用します。使用しているシステムに合わせて、このネットワーク別名を変更する必要があります。

手順1 サンプル表の作成
  1. SQL*Plusを起動します。

  2. ユーザー名scottとパスワードtigerを使用して接続します。

  3. demobld.sqlスクリプトを実行します。

    SQL> @ORACLE_BASE\ORACLE_HOME\sqlplus\demo\demobld.sql;
    

scottアカウントでemp表を作成した後で、Visual Basicのサンプルで実行されるストアド・プロシージャとストアド・ファンクションを含むPL/SQLパッケージを作成する必要があります。

手順2 PL/SQLパッケージの作成
  1. ユーザー名scottとパスワードtigerを使用して接続します。

  2. 「PL/SQLのパッケージ」で示した、PL/SQLパッケージを作成します。


    注意:

    PL/SQLパッケージを作成するときには、/文字が終了記号として使用されます。各CREATE PACKAGE...ENDブロックに続く別の行に、この文字を追加する必要があります。

Visual Basicプロジェクトの設定

Oracle Databaseの設定が完了すると、Visual Basic 6.0プロジェクトを作成できます。

  1. Visual Basic 6.0を起動して新しいプロジェクトを作成します。

  2. プロジェクト参照として、Microsoft ActiveX Data Objects 2.1 LibraryおよびMicrosoft ActiveX Data Objects Recordset 2.1 Libraryが含まれていることを確認します。

    vbprjref.gifの説明が続きます
    図vbprjref.gifの説明

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

    oledbvb1.gifの説明が続きます
    図oledbvb1.gifの説明

  4. 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
    
  5. 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
    
  6. プロジェクトを実行して結果を確認します。たとえば、「Get Employee Records by Dept」ボタンを選択すると、部門番号の入力を要求するダイアログ・ボックスが表示されます。

    oledbvb2.gifの説明が続きます
    図oledbvb2.gifの説明

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

    oledbvb3.gifの説明が続きます
    図oledbvb3.gifの説明