2 Oracle OLAP Provider for OLE DBの機能
次のトピックでは、Oracle OLAP Provider for OLE DB (プロバイダ)のコンポーネント、およびそれらを使用してOLE DB for OLAPアプリケーションを開発する方法について説明します。
2.1 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サービスは自動的に有効になります。
2.1.1 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管理者ガイドを参照してください。
2.1.2 プロバイダ固有の接続文字列属性
次に、Oracle OLAP Provider for OLE DBプロバイダ固有の接続文字列属性のリストを示します。
-
OSAuthent- オペレーティング・システム認証この機能により、オペレーティング・システム・ユーザーはOracleデータベースに接続できます。
オペレーティング・システム・ユーザーがデータベースに接続できるようにするには、次のいずれかを実行します。
-
OSAuthent接続文字列属性を"1"に設定しますまたは
-
UserId接続文字列属性を"/"に設定します。
オペレーティング・システム・ユーザーがデータベースに接続できないようにするには、次の手順を実行します。
-
OSAuthent接続文字列属性を"0"に設定します。
-
-
この機能により、パスワードの有効期限が切れている場合に、プロバイダはログオン中に非コンソール・アプリケーションのパスワード変更ダイアログ・ボックスを表示できます。
パスワードの失効時にダイアログ・ボックスが表示されるようにするには、次の手順を実行します。
-
PwdChgDlg接続文字列属性を"1"に設定します。
パスワードの失効時にダイアログ・ボックスを表示しないようにするには、次の手順を実行します。
-
PwdChgDlg接続文字列属性を"0"に設定します
-
-
PreserveMaxPrecision- 最大精度の保持この機能を使用すると、
NUMBER列およびFLOAT列の値の最大精度を保持するかどうかをアプリケーションで指定できます。この機能が有効な場合、プロバイダは、Oracleネイティブ型としてフェッチすることで列値の最大精度を保持します。この機能を無効にすると、プロバイダは列の値をCネイティブ型としてフェッチします。この場合、Cネイティブ型の制限に基づいて精度が失われる可能性があります。ただし、この方法では、数値データをOracleネイティブ型としてフェッチするよりもパフォーマンスが向上します。NUMBER列およびFLOAT列の値の最大精度を保持するには、次のようにします。-
PreserverMaxPrecision接続文字列属性を"1"に設定します。
NUMBER列およびFLOAT列の値の最大精度の保持を無効にするには、次の手順を実行します。-
PreserverMaxPrecision接続文字列属性を"0"に設定します
-
2.1.2.1 デフォルトの接続文字列属性値
プロバイダは、\\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セキュリティ・ガイドを参照してください。
2.2 セッション
OraOLEDB OLAPは、Oracleデータベースへの接続およびセッションを確立します。
OLE DB
OLE DBデータ・ソース・オブジェクトがインスタンス化されると、プロバイダはそれに対する接続とセッションの両方を確立します。そのデータ・ソース・オブジェクトからインスタンス化される最初のOLE DBセッション・オブジェクトは、すでに確立されている接続およびセッションを継承します。同じOLE DBデータ・ソース・オブジェクトから作成された後続のOLE DBセッション・オブジェクトは、独自の接続およびセッションを確立します。
ADO MD
新しい接続がADO MDオブジェクトによって確立されるたびに、その接続に対してセッションが暗黙的に作成されます。
2.3 スキーマ情報
OraOLEDB OLAPでは、この項にリストされているコアOLE DBスキーマ行セットおよびOLE DB for OLAPスキーマ行セットの両方がサポートされています。DBSCHEMAおよびMDSCHEMAマクロは、OLE DBアプリケーションで使用できます。SchemaEnum値(丸カッコ内)は、ADO MDアプリケーションで使用できます。
2.3.1 コアOLE DBスキーマ行セット
-
DBSCHEMA_COLUMNS(adSchemaColumns) -
DBSCHEMA_SCHEMATA(adSchemaSchemata) -
DBSCHEMA_TABLES(adSchemaTables) -
DBSCHEMA_PROVIDER_TYPES(adSchemaProviderTypes)
関連項目:
サポートされているスキーマ行セット列については、コアOLE DBスキーマ行セットを参照してください
2.3.2 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によって生成される一意の名前は、基礎となるメタデータが変更されない場合、セッション間で一貫しています。一部のディメンションはキューブ間で共有できるため、同じ一意の名前を複数のキューブに表示できます。ただし、プロバイダは、キューブのコンテキスト内で一意の名前が純粋に一意であることを保証します。
2.4 プロバイダ固有のプロパティ
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.4.1 プロバイダ固有の行セットのプロパティ
表2-1に、DBPROPSET_ORAOLEDBOLAP_ROWSETプロパティ・セットの一部であるDBPROP_ORAOLEDBOLAP_ROWSETFETCHSIZEプロパティを示します。DBPROPSET_ORAOLEDBOLAP_ROWSETは、行セット・プロパティ・グループに属します。
表2-1 プロバイダ固有の行セットのプロパティ
| プロパティ名 | 型 | R/W | デフォルト値 |
|---|---|---|---|
|
|
|
R/W |
|
このプロパティは、IDBSchemaRowset::GetRowset()メソッドを使用してスキーマ行セットをリクエストする場合にのみ設定できます。プロパティ値は、特定のスキーマ行セットに対して行われたサーバー・ラウンドトリップごとにOraOLEDB OLAPがフェッチするデータの最大量(バイト)を指定します。
2.4.2 プロバイダ固有のコマンドのプロパティ
プロバイダ固有のプロパティは、行セット・プロパティ・セット・グループの一部である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);
...2.4.2.1 キャッシュ動作
IMDDataset::GetCellData()の呼出しごとに、プロバイダは、リクエストされたセルがすべてキャッシュ内にあるかどうかを確認します。リクエストされたセルがすべてキャッシュ内にある場合、サーバー・ラウンドトリップを発生させずにセル・データが返されます。リクエストを満たすためにデータベースからフェッチする必要があるセルがある場合、プロバイダはサーバー・ラウンドトリップを発生させ、少なくともキャッシュ・ブロック・サイズで指定されたセル数をフェッチします。
アプリケーションによるセル取得リクエストが複数のキャッシュ・ブロックにまたがる場合、プロバイダは単一のサーバー・ラウンドトリップのみを行い、すべてのブロックをフェッチします。
2.4.2.2 パフォーマンス
通常のスプレッドシートのようなOLAPアプリケーションでは、C列とR行のグリッドに限られたデータ・セットが表示されます。このようなアプリケーションでは、キャッシュ・ブロック・サイズを{C, R, 1, 1,...}以上に設定する必要があります。これにより、最初のグリッド表示で複数のサーバー・ラウンドトリップが発生しないようになります。この方法では、アプリケーション・ユーザーが最初のC列とR行を超えてデータを要求する場合にのみ、追加のサーバーラウンドトリップが必要になります。
通常、ユーザーがこれらの初期C列とR行を超えてデータをリクエストする場合、{C, R, 1, 1,...}より若干大きいキャッシュ・ブロック・サイズ(たとえば、{C * 2, R * 2, 1, 1,...})は、パフォーマンスを強化できます。ただし、不必要に大きなキャッシュ・ブロック・サイズを使用すると、フェッチ・リクエストが複雑になり、サーバー側でより多くの処理時間が必要になります。
2.5 MDXの実行
OraOLEDB OLAPでは、MDX文のみがサポートされています。
2.5.1 MDXキーワード
OraOLEDB OLAPでは、付録に示されているMDXキーワードのコレクションがサポートされています。
関連項目:
キーワード・リストの詳細は、MDXキーワードを参照してください
2.7 Unicodeのサポート
Oracle OLAP Provider for OLE DBはUnicodeキャラクタ・セットをサポートしているため、コンシューマは同じクライアント・コンピュータ上の様々な言語でデータを取得できます。これは、Unicode標準で必要とされる数の言語をサポートするグローバル・インターネット・アプリケーションの作成に特に役立ちます。たとえば、Oracleデータベースにアクセスする単一のActive Server Page (ASP)を作成して、日本語、アラビア語、英語、タイ語のコンテンツを動的に生成できます。
2.7.1 Unicodeエンコーディングのタイプ
Oracleデータベースは、UnicodeのASCII互換のマルチバイト・エンコーディングであるUTF8コード体系でUnicodeデータを格納します。サポートされているMicrosoftオペレーティング・システムでは、2バイト固定幅のエンコード・スキームであるUCS2エンコーディングを使用します。OraOLEDB OLAPは、2つのコード体系間でデータを透過的に変換し、コンシューマがUCS2のみに対処できるようにします。
注意:
Unicodeサポートは、ADO MDコンシューマに対して透過的です。C/C++を使用しているOLE DBコンシューマは、Unicodeデータが含まれている場合には、データ型バインドでDBTYPE_WSTRを明示的に指定する必要があります。
2.8 エラー・メッセージ情報
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