スキーマ行セットを使用したメタデータの取得
プロバイダー、行セット、テーブル、列、またはその他のデータベース情報に関する情報を行セットを開かずに取得することが必要な場合があります。 データベース構造に関するデータはメタデータと呼ばれます。メタデータはさまざまな方法で取得できます。 1 つは、スキーマ行セットを使用する方法です。
OLE DB テンプレートは、スキーマ情報を取得するためのクラスのセットを提供します。これらのクラスは、定義済みのスキーマ行セットを作成します。「スキーマ行セット クラスと Typedef クラス」にクラスの一覧を示しています。
Note
OLAP を使用していて、行セットの一部がスキーマ行セット クラスでサポートされていない場合 (列数が変数の場合など) は、CManualAccessor
または CDynamicAccessor
の使用を検討する必要があります。 列をスクロールし、case ステートメントを使用して、各列で可能なデータ型を処理できます。
カタログ/スキーマ モデル
ANSI SQL はデータ ストアのカタログ/スキーマ モデルを定義しています。OLE DB はこのモデルを使用します。 このモデルでは、カタログ (データベース) にスキーマがあり、スキーマにテーブルがあります。
カタログ カタログは、データベースの別の名前です。 これは、関連するスキーマのコレクションです。 特定のデータ ソースに属するカタログ (データベース) の一覧を表示するには、CCatalog を使用します。 多くのデータベースにはカタログが 1 つしかないため、メタデータはスキーマ情報と呼ばれることがあります。
スキーマ スキーマは、特定のユーザーが所有している、または作成したデータベース オブジェクトのコレクションです。 特定のユーザーが所有しているスキーマの一覧を表示するには、CSchemata を使用します。
Microsoft SQL Server および ODBC 2.x の用語では、スキーマは所有者です (たとえば、dbo は一般的なスキーマ名です)。 また、SQL Server では、メタデータが一連のテーブルに格納されます。1 つのテーブルにはすべてのテーブルの一覧が含まれており、別のテーブルにはすべての列の一覧が含まれています。 Microsoft Access データベースにはスキーマに相当するものはありません。
テーブル テーブルは、特定の順序で並べられた列のコレクションです。 特定のカタログ (データベース) で定義されているテーブルを一覧表示し、それらのテーブルに関する情報を表示するには、CTables を使用します。
制限
スキーマ情報を照会するときに、制約を使用して、目的の情報の種類を指定できます。 制約は、クエリのフィルターまたは修飾子として考えることができます。 たとえば、次のクエリについて考えます。
SELECT * FROM authors WHERE l_name = 'pivo'
このクエリでは、l_name
が制約です。 これは制約が 1 つしかない単純な例です。スキーマ行セット クラスは複数の制約をサポートします。
スキーマ行セットの typedef クラスは、すべての OLE DB スキーマ行セットをカプセル化するため、スキーマ行セットは他の行セットと同様に初期化して開くことでアクセスできます。 たとえば、typedef クラス CColumns は次のように定義されます。
CRestrictions<CAccessor<CColumnsInfo>
CRestrictions クラスでは制約がサポートされています。 スキーマ行セットのインスタンスを作成した後で、CRestrictions::Open を呼び出します。 このメソッドは、指定された制約に基づいて結果セットを返します。
制約を指定するには、「付録 B スキーマ行セット」を参照し、使用する行セットを検索してください。 たとえば、CColumns
は COLUMNS Rowset に対応します。COLUMNS Rowset のトピックでは、COLUMNS 行セットの制約列の一覧 (TABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME) を示しています。 制約を指定するときは、この順序に従う必要があります。
このため、たとえばテーブル名で制約する場合は、TABLE_NAME を 3 番目の制約列とし、Open
を呼び出して、3 番目の制約パラメーターとして目的のテーブル名を指定します。これを次の例に示します。
スキーマ行セットを使用するには
Atldbsch.h ヘッダー ファイル
Atldbsch.h
をインクルードします (コンシューマー サポート用にAtldbcli.h
も必要です)。コンシューマーまたはドキュメントのヘッダー ファイル内のスキーマ行セット オブジェクトをインスタンス化します。 テーブル情報が必要な場合は
CTables
オブジェクトを宣言します。列情報が必要な場合はCColumns
オブジェクトを宣言します。 authors テーブルの列を取得する方法の例を次に示します。CDataSource ds; ds.Open(); CSession ss; ss.Open(ds); CColumns columnSchemaRowset; // TABLE_NAME is the third restriction column, so // specify "authors" as the third restriction parameter: HRESULT hr = columnSchemaRowset.Open(ss, NULL, NULL, L"authors"); hr = columnSchemaRowset.MoveFirst(); while (hr == S_OK) { hr = columnSchemaRowset.MoveNext(); }
情報をフェッチするには、スキーマ行セット オブジェクトの適切なデータ メンバーにアクセスします。たとえば、
ColumnSchemaRowset.m_szColumnName
にアクセスします。 このデータ メンバーは COLUMN_NAME に対応します。 各データ メンバーが OLE DB のどの列に対応するかについては、「CColumns」を参照してください。
OLE DB テンプレートに用意されているスキーマ行セット typedef クラスのリファレンスについては、「スキーマ行セット クラスと Typedef クラス」を参照してください。
OLE DB スキーマ行セット (制約列を含む) の詳細については、『OLE DB Programmer's Reference (OLE DB プログラマー リファレンス)』の「Appendix B: Schema Rowsets (付録 B: スキーマ行セット)」を参照してください。
スキーマ行セット クラスを使用する方法の複雑な例については、CatDB と DBViewer のサンプルを参照してください。
プロバイダーでのスキーマ行セットのサポートについては、「スキーマ行セットのサポート」を参照してください。