2 Oracle OLAP Provider for OLE DBの機能
次のトピックでは、Oracle OLAP Provider for OLE DB (プロバイダ)のコンポーネント、およびそれらを使用してOLE DB for OLAPアプリケーションを開発する方法について説明します。
Oracle OLAP Provider for OLE DBの使用
プロバイダを使用するには、アプリケーションで一意に識別できる必要があります。識別プロセスは、プロバイダの呼出しにOLE DBまたはADO MDのどちらが使用されるかによって異なります。
OLE DB
クラスID (CLSID)は、OLE DBプロバイダを一意に識別します。OraOLEDBOLAP.h
に定義されているマクロCLSID_OraOLEDBOLAP
は、OraOLEDB OLAPのCLSIDを定義します。CoCreateInstance()
APIは、次のコード・スニペットに示すように、このマクロをパラメータとして使用してプロバイダのデータ・ソース・オブジェクトのインスタンスを作成し、それに対するインタフェース・ポインタを取得します。
#include <OraOLEDBOLAP.h> ... HRESULT hr; IDBInitialize *pIDBInitialize; hr = CoCreateInstance(CLSID_OraOLEDBOLAP, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize);
OLE DBサービス(クライアント・カーソル、接続プーリングなど)をOraOLEDB OLAPと組み合せて使用するには、かわりに次のAPIを呼び出します。
#include <OraOLEDBOLAP.h> ... HRESULT hr; IDataInitialize *pIDataInitialize; IDBInitialize *pIDBInitialize; hr = CoCreateInstance(CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, IID_IDataInitialize,(void**)&pIDataInitialize); hr = pIDataInitialize->CreateDBInstance(CLSID_OraOLEDBOLAP, NULL, CLSCTX_INPROC_SERVER,NULL, IID_IDBInitialize,(IUnknown**) &pIDBInitialize);
ADO MD
ADO MDを介して特定のOLE DB for OLAPプロバイダを使用するには、プログラムID (ProgID)を「Provider
」接続文字列属性の値として指定する必要があります。次のコード・スニペットに示すように、プロバイダ値を「OraOLEDB.OLAP
」に設定します。
Dim cat As New ADOMD.Catalog ... cat.ActiveConnection = "Provider=OraOLEDB.OLAP;" & _ "User Id=sh;Password=sh;Data Source=oracle;"
ADO MDを使用する場合、OLE DBサービスは自動的に有効になります。
Oracle Databaseへの接続
OraOLEDB OLAPは、Oracleデータベースへの接続をサポートします。ほとんどの場合、User
Id
、Password
およびData
Source
は接続を確立するために必要です。ローカル・データベースに接続するときは、データ・ソースは必要ありません。ただし、リモート・データベースに接続するときは、データ・ソースを指定し、適切なOracle Netサービス名に設定する必要があります。これは、tnsnames.ora
ファイルに別名として含める必要があります。
OLE DB
OLE DBアプリケーションをOracleデータベースに接続するには、コンシューマは通常、DBPROPSET_DBINIT
プロパティ・セットの次のプロパティを設定します。
-
DBPROP_AUTH_USERNAME
-
DBPROP_AUTH_PASSWORD
-
DBPROP_INIT_DATABASE
ADO MD
ADO MDアプリケーションの場合、次の例に示すように、ユーザー名、パスワードおよびデータ・ソースは接続文字列内に設定されます。
Dim cat As New ADOMD.Catalog ... cat.ActiveConnection = "Provider=OraOLEDB.OLAP;" & _ "User Id=<userid>;Password=<password>;Data Source=oracle;"
関連項目:
詳細は、Oracle Net Services管理者ガイドを参照してください。
プロバイダ固有の接続文字列属性
次に、Oracle OLAP Provider for OLE DBプロバイダ固有の接続文字列属性のリストを示します。
-
OSAuthent
- オペレーティング・システム認証この機能により、オペレーティング・システム・ユーザーはOracleデータベースに接続できます。
オペレーティング・システム・ユーザーがデータベースに接続できるようにするには、次のいずれかを実行します。
-
OSAuthent
接続文字列属性を"1"
に設定しますまたは
-
User
Id
接続文字列属性を"/"
に設定します。
オペレーティング・システム・ユーザーがデータベースに接続できないようにするには、次の手順を実行します。
-
OSAuthent
接続文字列属性を"0"
に設定します。
-
-
この機能により、パスワードの有効期限が切れている場合に、プロバイダはログオン中に非コンソール・アプリケーションのパスワード変更ダイアログ・ボックスを表示できます。
パスワードの失効時にダイアログ・ボックスが表示されるようにするには、次の手順を実行します。
-
PwdChgDlg
接続文字列属性を"1"
に設定します。
パスワードの失効時にダイアログ・ボックスを表示しないようにするには、次の手順を実行します。
-
PwdChgDlg
接続文字列属性を"0"
に設定します
-
-
PreserveMaxPrecision
- 最大精度の保持この機能を使用すると、
NUMBER
列およびFLOAT
列の値の最大精度を保持するかどうかをアプリケーションで指定できます。この機能が有効な場合、プロバイダは、Oracleネイティブ型としてフェッチすることで列値の最大精度を保持します。この機能を無効にすると、プロバイダは列の値をCネイティブ型としてフェッチします。この場合、Cネイティブ型の制限に基づいて精度が失われる可能性があります。ただし、この方法では、数値データをOracleネイティブ型としてフェッチするよりもパフォーマンスが向上します。NUMBER
列およびFLOAT
列の値の最大精度を保持するには、次のようにします。-
PreserverMaxPrecision
接続文字列属性を"1"
に設定します。
NUMBER
列およびFLOAT
列の値の最大精度の保持を無効にするには、次の手順を実行します。-
PreserverMaxPrecision
接続文字列属性を"0"
に設定します
-
デフォルトの接続文字列属性値
プロバイダは、\\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE \OLEDBOLAP
レジストリ・キーから、プロバイダ固有の接続文字列属性のデフォルトの属性値を取得します。プロバイダ固有の接続文字列属性が接続文字列に設定されていない場合、レジストリで指定された値が使用されます。これらの属性が接続文字列に設定されている場合、指定された値はレジストリで設定されたデフォルト値をオーバーライドします。
レジストリのデフォルト値を変更すると、接続文字列内のデフォルトの属性値をオーバーライドしないすべてのOraOLEDB OLAPアプリケーションに影響する場合があります。
注意:
プロバイダがレジストリ値を読み取るのはロード時に一度のみのため、レジストリ値に対する変更は、すでに実行中のアプリケーションには影響しません。
OLE DB
OLE DBアプリケーションからプロバイダ固有の接続文字列属性を設定するには、DBPROP_INIT_PROVIDERSTRING
プロパティを使用します。複数のプロバイダ固有の接続文字列属性を設定するには、属性値ペアをセミコロンで区切ります。たとえば、OSAuthent
とPwdChgDlg
の両方を有効にするには、OLE DBアプリケーションでDBPROP_INIT_PROVIDERSTRING
プロパティを"OSAuthent=1;PwdChgDlg=1;PreserveMaxPrecision=1"
に設定できます。
ADO MD
ADO MDアプリケーションでは、次のコード・スニペットのように、接続文字列でこれらのプロバイダ固有の属性値をユーザー名、パスワードおよびデータ・ソースとともに設定できます。
Dim cat As New ADOMD.Catalog ... cat.ActiveConnection = "Provider=OraOLEDB.OLAP;" & _ "User Id=<userid>;Password=<password>;Data Source=oracle;" & _ "OSAuthent=1;PwdChgDlg=1;PreserveMaxPrecision=1"
関連項目:
パスワードの有効期限およびWindowsでのデータベース・ユーザーの認証の詳細は、Oracle Databaseセキュリティ・ガイドを参照してください。
セッション
OraOLEDB OLAPは、Oracleデータベースへの接続およびセッションを確立します。
OLE DB
OLE DBデータ・ソース・オブジェクトがインスタンス化されると、プロバイダはそれに対する接続とセッションの両方を確立します。そのデータ・ソース・オブジェクトからインスタンス化される最初のOLE DBセッション・オブジェクトは、すでに確立されている接続およびセッションを継承します。同じOLE DBデータ・ソース・オブジェクトから作成された後続のOLE DBセッション・オブジェクトは、独自の接続およびセッションを確立します。
ADO MD
新しい接続がADO MDオブジェクトによって確立されるたびに、その接続に対してセッションが暗黙的に作成されます。
スキーマ情報
OraOLEDB OLAPでは、この項にリストされているコアOLE DBスキーマ行セットおよびOLE DB for OLAPスキーマ行セットの両方がサポートされています。DBSCHEMA
およびMDSCHEMA
マクロは、OLE DBアプリケーションで使用できます。SchemaEnum
値(丸カッコ内)は、ADO MDアプリケーションで使用できます。
コアOLE DBスキーマ行セット
-
DBSCHEMA_COLUMNS
(adSchemaColumns
) -
DBSCHEMA_SCHEMATA
(adSchemaSchemata
) -
DBSCHEMA_TABLES
(adSchemaTables
) -
DBSCHEMA_PROVIDER_TYPES
(adSchemaProviderTypes
)
関連項目:
サポートされているスキーマ行セット列については、コアOLE DBスキーマ行セットを参照してください
OLE DB for OLAPスキーマ行セット
-
MDSCHEMA_CUBES
(adSchemaCubes
) -
MDSCHEMA_DIMENSIONS
(adSchemaDimensions
) -
MDSCHEMA_FUNCTIONS
(adSchemaFunctions
) -
MDSCHEMA_HIERARCHIES
(adSchemaHierarchies
) -
MDSCHEMA_LEVELS
(adSchemaLevels
) -
MDSCHEMA_MEASURES
(adSchemaMeasures
) -
MDSCHEMA_MEMBERS
(adSchemaMembers
) -
MDSCHEMA_PROPERTIES
(adSchemaProperties
) -
MDSCHEMA_SETS
(adSchemaSets
)
関連項目:
サポートされているスキーマ行セット列については、OLE DB for OLAPスキーマ行セットを参照してください
OraOLEDB OLAPによって生成される一意の名前は、基礎となるメタデータが変更されない場合、セッション間で一貫しています。一部のディメンションはキューブ間で共有できるため、同じ一意の名前を複数のキューブに表示できます。ただし、プロバイダは、キューブのコンテキスト内で一意の名前が純粋に一意であることを保証します。
プロバイダ固有のプロパティ
OraOLEDB OLAPでは、次のプロバイダ固有のプロパティ・セットおよびプロパティが公開され、OLE DBアプリケーションでのみ使用できます。
-
DBPROPSET_ORAOLEDBOLAP_ROWSET
プロパティ・セット-
DBPROP_ORAOLEDBOLAP_ROWSETFETCHSIZE
プロパティ
-
-
DBPROPSET_ORAOLEDBOLAP_COMMAND
プロパティ・セット-
MDPROP_ORAOLEDBOLAP_CELLDATACACHE
プロパティ -
MDPROP_ORAOLEDBOLAP_CACHEBLOCKSIZE
プロパティ -
MDPROP_ORAOLEDBOLAP_PRESERVEMAXPRECISION
プロパティ
-
ADO MDアプリケーションの場合、デフォルトのプロパティ値が使用されます。
プロバイダ固有の行セットのプロパティ
表2-1に、DBPROPSET_ORAOLEDBOLAP_ROWSET
プロパティ・セットの一部であるDBPROP_ORAOLEDBOLAP_ROWSETFETCHSIZE
プロパティを示します。DBPROPSET_ORAOLEDBOLAP_ROWSET
は、行セット・プロパティ・グループに属します。
表2-1 プロバイダ固有の行セットのプロパティ
プロパティ名 | 型 | R/W | デフォルト値 |
---|---|---|---|
|
|
R/W |
|
このプロパティは、IDBSchemaRowset::GetRowset()
メソッドを使用してスキーマ行セットをリクエストする場合にのみ設定できます。プロパティ値は、特定のスキーマ行セットに対して行われたサーバー・ラウンドトリップごとにOraOLEDB OLAPがフェッチするデータの最大量(バイト)を指定します。
プロバイダ固有のコマンドのプロパティ
プロバイダ固有のプロパティは、行セット・プロパティ・セット・グループの一部であるDBPROPSET_ORAOLEDBOLAP_COMMAND
プロパティ・セットの一部です。
表2-2に、プロバイダ固有のOLE DBコマンド・プロパティを示します。これらのプロパティは、MDX文の実行前に設定された場合にのみ有効になります。
表2-2 プロバイダ固有のコマンドのプロパティ
プロパティ名 | 型 | R/W | デフォルト値 |
---|---|---|---|
|
|
R/W |
|
|
|
R/W |
|
|
|
R/W |
|
MDPROP_ORAOLEDBOLAP_CELLDATACACHE (セル・データ・キャッシュ)
OLE DBコンシューマは、MDPROP_ORAOLEDBOLAP_CELLDATACACHE
プロパティをVARIANT_TRUE
またはVARIANT_FALSE
に設定することで、結果セットのデータ・セルのキャッシュを有効化または無効化できます。
セル・データ・キャッシュが有効な場合、OraOLEDB OLAPプロバイダは、サーバー・ラウンドトリップごとにMDPROP_ORAOLEDBOLAP_CACHEBLOCKSIZE
で指定されたセル数以上をフェッチしようとします。
MDPROP_ORAOLEDBOLAP_CACHEBLOCKSIZE (キャッシュ・ブロック・サイズ)
OLE DBコンシューマは、VT_I4
値の配列でMDPROP_ORAOLEDBOLAP_CACHEBLOCKSIZE
プロパティを設定することで、キャッシュ・ブロック・サイズを明示的に設定できます。
セル・データ・キャッシュが有効な場合、キャッシュ・ブロック・サイズによって次のことが決定されます。
-
キャッシュ・ブロックの形状。
-
サーバー・ラウンドトリップごとにプロバイダがフェッチを試行するセル・データの最小量。
キャッシュ・ブロック・サイズがデフォルト値のNULL
に設定されている場合、プロバイダは結果セットに適したキャッシュ・ブロック・サイズを決定します。
デフォルトの動作をオーバーライドするには、OLE DBコンシューマは4バイトの整数の配列を指定する必要があります。OraOLEDB OLAPは、指定された配列値を使用して、キャッシュ・ブロック・サイズの形状を決定します。配列の0
番目の索引の値によって、X軸(Axis(0)
)からフェッチされるセルの数が決まります。配列の1番目の索引の値によって、Y軸(Axis(1)
)からフェッチされるセルの数が決まります。通常、配列のn
番目の索引の値によって、Axis(
n
)
からフェッチされるセルの数が決まります。
配列の長さが結果セットに存在する実際の軸数より大きい場合、余分な値は無視されます。ただし、配列の長さが結果セットに存在する実際の軸数より小さい場合、プロバイダは欠損値に適切な値を移入します。
MDPROP_ORAOLEDBOLAP_PRESERVEMAXPRECISION (最大精度を保持)
OLE DBコンシューマは、MDPROP_ORAOLEDBOLAP_PRESERVEMAXPRECISION
プロパティをVARIANT_TRUE
またはVARIANT_FALSE
に設定して、数値セル・データのフェッチ時に最大精度を保持するか、パフォーマンスを最大化するかを選択できます。
このプロパティは、レジストリ値をオーバーライドするPreserveMaxPrecision
接続文字列属性を使用して設定することもできます。
接続から作成されたすべてのコマンドは、接続文字列(またはレジストリが設定されている場合はレジストリ)で指定された値を継承します。コマンド・オブジェクトで公開されるMDPROP_ORAOLEDBOLAP_PRESERVEMAXPRECISION
プロパティを使用すると、OLE DBコンシューマが特定のコマンド・オブジェクトでこの継承値をオーバーライドできます。
OLE DBの例
... HRESULT hr = S_OK; ICommandText *pICmdText = NULL; ICommandProperties *pICmdProperties = NULL; IMDDataset *pIMDDataset = NULL: long *px = NULL; SAFEARRAY *psa = NULL; SAFEARRAYBOUND rgsabound[1]; DBPROPSET dbPropSets[1]; DBPROP dbProp[3]; ... hr = pIDBCreateCmd->CreateCommand(NULL, IID_ICommandText, (IUnknown **)&pICmdText); hr = pICmdText->SetCommandText(DBGUID_DEFAULT, pCmdText); hr = pICmdText->QueryInterface(IID_ICommandProperties, (void**)&pICmdProperties); // Create the SAFEARRAY rgsabound[0].lLbound = 0; rgsabound[0].cElements = 3; psa = SafeArrayCreate(VT_I4, 1, rgsabound); // Get a pointer to the elements of the array. hr = SafeArrayAccessData(psa, (void HUGEP* FAR*)&px); // Create an array for a cache block size of {20, 40, 1} // that will fetch 800 cells for each server round-trip px[0] = 20; // 20 coordinates from Axis(0) px[1] = 40; // 40 coordinates from Axis(1) px[2] = 1; // 1 coordinate from Axis(2) dbPropSets[0].rgProperties = &dbProp[0]; dbPropSets[0].guidPropertySet = DBPROPSET_ORAOLEDBOLAP_COMMAND; dbPropSets[0].cProperties = 3; dbProp[0].dwPropertyID = MDPROP_ORAOLEDBOLAP_CELLDATACACHE; dbProp[0].dwOptions = DBPROPOPTIONS_OPTIONAL; dbProp[0].colid = DB_NULLID; V_VT(&(dbProp[0].vValue)) = VT_BOOL; dbProp[0].vValue.boolVal = VARIANT_TRUE; dbProp[1].dwPropertyID = MDPROP_ORAOLEDBOLAP_CACHEBLOCKSIZE; dbProp[1].dwOptions = DBPROPOPTIONS_OPTIONAL; dbProp[1].colid = DB_NULLID; V_VT(&(dbProp[1].vValue)) = VT_ARRAY | VT_I4; dbProp[1].vValue.parray = psa; dbProp[2].dwPropertyId = MDPROP_ORAOLEDBOLAP_PRESERVEMAXPRECISION; dbProp[2].dwOptions = DBPROPOPTIONS_OPTIONAL; dbProp[2].colid = DB_NULLID; V_VT(&(dbProp[2].vValue)) = VT_BOOL; dbProp[2].vValue.boolVal = VARIANT_FALSE; hr = pICmdProperties->SetProperties(1, dbPropSets); SafeArrayUnaccessData(psa); SafeArrayDestroy(psa); // Execute the MDX statement hr = pICmdText->Execute(NULL, IID_IMDDataset, NULL, NULL, (IUnknown **)&pIMDDataset); ...
キャッシュ動作
IMDDataset::GetCellData()
の呼出しごとに、プロバイダは、リクエストされたセルがすべてキャッシュ内にあるかどうかを確認します。リクエストされたセルがすべてキャッシュ内にある場合、サーバー・ラウンドトリップを発生させずにセル・データが返されます。リクエストを満たすためにデータベースからフェッチする必要があるセルがある場合、プロバイダはサーバー・ラウンドトリップを発生させ、少なくともキャッシュ・ブロック・サイズで指定されたセル数をフェッチします。
アプリケーションによるセル取得リクエストが複数のキャッシュ・ブロックにまたがる場合、プロバイダは単一のサーバー・ラウンドトリップのみを行い、すべてのブロックをフェッチします。
パフォーマンス
通常のスプレッドシートのようなOLAPアプリケーションでは、C列とR行のグリッドに限られたデータ・セットが表示されます。このようなアプリケーションでは、キャッシュ・ブロック・サイズを{C,
R
, 1,
1,...}
以上に設定する必要があります。これにより、最初のグリッド表示で複数のサーバー・ラウンドトリップが発生しないようになります。この方法では、アプリケーション・ユーザーが最初のC列とR行を超えてデータを要求する場合にのみ、追加のサーバーラウンドトリップが必要になります。
通常、ユーザーがこれらの初期C列とR行を超えてデータをリクエストする場合、{C,
R,
1,
1,...}
より若干大きいキャッシュ・ブロック・サイズ(たとえば、{C * 2,
R
*
2,
1,
1,...}
)は、パフォーマンスを強化できます。ただし、不必要に大きなキャッシュ・ブロック・サイズを使用すると、フェッチ・リクエストが複雑になり、サーバー側でより多くの処理時間が必要になります。
Unicodeのサポート
Oracle OLAP Provider for OLE DBはUnicodeキャラクタ・セットをサポートしているため、コンシューマは同じクライアント・コンピュータ上の様々な言語でデータを取得できます。これは、Unicode標準で必要とされる数の言語をサポートするグローバル・インターネット・アプリケーションの作成に特に役立ちます。たとえば、Oracleデータベースにアクセスする単一のActive Server Page (ASP)を作成して、日本語、アラビア語、英語、タイ語のコンテンツを動的に生成できます。
Unicodeエンコーディングのタイプ
Oracleデータベースは、UnicodeのASCII互換のマルチバイト・エンコーディングであるUTF8コード体系でUnicodeデータを格納します。サポートされているMicrosoftオペレーティング・システムでは、2バイト固定幅のエンコード・スキームであるUCS2エンコーディングを使用します。OraOLEDB OLAPは、2つのコード体系間でデータを透過的に変換し、コンシューマがUCS2のみに対処できるようにします。
注意:
Unicodeサポートは、ADO MDコンシューマに対して透過的です。C/C++を使用しているOLE DBコンシューマは、Unicodeデータが含まれている場合には、データ型バインドでDBTYPE_WSTR
を明示的に指定する必要があります。
エラー・メッセージ情報
OraOLEDB OLAPでは、拡張エラー情報がサポートされています。この情報を取得するメカニズムは、OraOLEDB OLAPの呼出しにOLE DBまたはADO MDのどちらが使用されるかによって異なります。
OLE DB
OLE DBオブジェクトおよびCOMオブジェクトは、オブジェクト・メンバー・ファンクションのHRESULT
リターン・コードによってエラーを報告します。OLE/COMのHRESULT
はビット圧縮された構造体です。OLE DBには構造体メンバーの参照を解除するマクロがあります。Oracle OLAP Provider for OLE DBは、エラーに関する情報を取得するためのIErrorLookup
を公開します。
すべてのオブジェクトは拡張エラー情報をサポートします。このため、コンシューマは、OLE DB拡張エラー・オブジェクトをインスタンス化し、続いてGetErrorDescription()
メソッドをコールして、エラー・テキストを取得する必要があります。
// Instantiate OraOLEDBOLAPErrorLookup and obtain a pointer to its // IErrorLookup interface IErrorLookup *pErrorLookup = NULL; CoCreateInstance(CLSID_OraOLEDBOLAPErrorLookup, NULL, CLSCTX_INPROC_SERVER, IID_IErrorLookup, (void **)&pIErrorLookup) //Call the method GetErrorDescription() to get the full error text pIErrorLookup->GetErrorDescription()
ADO MD
ADO MDユーザーの場合、エラー情報をフェッチするために、汎用Error
オブジェクトを使用できます。
Dim cat As New ADOMD.Catalog Sub Connect() On Error GoTo ErrorHandler cat.ActiveConnection = "Provider=OraOLEDB.OLAP;" & _ "User Id=sh;Password=sh;Data Source=oracle;" Exit Sub ErrorHandler: Debug.Print Err.Description End Sub