共用方式為


使用結構描述資料列集取得中繼資料

有時您會需要在不用開啟資料列集的情況下,取得提供者、資料列集、資料表、資料行的相關資訊或是其他資料庫資訊。 有關資料庫結構的資料稱為中繼資料,並且可使用許多不同的方法擷取。 其中一種方法便是使用結構描述資料列集。

OLE DB 樣板提供了一組可以擷取結構描述資訊的類別;這些列於 Schema Rowset Classes and Typedef Classes 的類別會建立預先定義的結構描述資料列集。

注意事項注意事項

如果您使用的是 OLAP,且結構描述資料列集類別不支援某些資料列集 (例如,您有資料行的變數數字),就應該考慮使用 CManualAccessorCDynamicAccessor。 您可以捲動資料行,並且使用 case 陳述式處理每個資料行的可能資料型別。

目錄/結構描述模型

ANSI SQL 會為資料存放區定義目錄 (Catalog) /結構描述,OLE DB 則會使用這個模型。 在這個模型中,目錄 (資料庫) 包含了結構描述,而結構描述則包含資料表。

  • 目錄:目錄是資料庫的另一個名稱。 它是一個相關的結構描述之集合。 若要列出屬於指定的資料來源之目錄 (資料庫),請使用 CCatalog。 因為許多資料庫都只有一個目錄,中繼資料有時會簡稱為結構描述資訊。

  • 結構描述:結構描述是由特定使用者所擁有或建立的資料庫物件集合。 若要列出指定的使用者所擁有的結構描述,請使用 CSchemata

    在 Microsoft SQL Server 和 ODBC 2.x 詞彙中,結構描述是指擁有人 (例如,dbo 是典型的結構描述名稱)。 同樣地,SQL Server 會將中繼資料儲存在一組資料表中:其中一個資料表包含所有資料表的清單,而另一個資料表則包含所有資料行的清單。 Microsoft Access 資料庫中並沒有與結構描述相當的詞彙。

  • 資料表:資料表是以特定順序排列的資料行之集合。 若要列出在指定的目錄 (資料庫) 中所定義的資料表,以及那些資料表的相關資訊,請使用 CTables)。

限制

您可以在查詢結構描述資訊時,使用限制以指定您有興趣的資訊類型。 您可以將限制當成查詢中的篩選條件或限定詞 (Qualifier)。 例如,在下列查詢中:

SELECT * FROM authors where l_name = 'pivo'

限制是 l_name。 這個範例相當簡單,只有使用一個限制;結構描述資料列集類別可以支援不同的限制。

結構描述資料列集 typedef 類別會封裝所有的 OLE DB 結構描述資料列集,因此您可以像其他任何資料列集,以執行個體化和開啟方式來存取結構描述資料列集。 例如,typedef 類別 CColumns 會如下定義:

CRestrictions<CAccessor<CColumnsInfo>

CRestrictions 類別可以提供限制支援。 在您建立結構描述資料列集的執行個體之後,請呼叫 CRestrictions::Open。 這個方法會根據您指定的限制傳回結果集。

若要指定限制,請參閱附錄 B:結構描述資料列集,查詢您正在使用的資料列集。 例如,CColumns 會對應至 COLUMNS 資料列集;該主題會列出 COLUMNS 資料列集中的限制資料行,包括:TABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME。 您必須依照這個順序指定您的限制。

例如,如果您以資料表名稱作限制,請注意,TABLE_NAME 是第三個限制資料行,因此接下來呼叫 Open 時,必須將需要的資料表名稱指定成第三個限制參數,請參考下列範例。

若要使用結構描述資料列集

  1. 您必須包含標頭檔 Atldbsch.h (當然您也需要 Atldbcli.h 來支援消費者)。

  2. 在消費者或文件標頭檔中產生結構描述資料列集物件。 如果您需要資料表資訊,請宣告 CTables 物件;如果您需要資料行資訊,請宣告 CColumns 物件。 這個範例顯示如何擷取 authors 資料表中的資料行:

    CDataSource ds;
    ds.Open();
    CSession ss;
    ss.Open();
    CColumns ColumnSchemaRowset;
    // TABLE_NAME is the third restriction column, so
    // specify "authors" as the third restriction parameter:
    hr = ColumnSchemaRowset.Open(ss, NULL, NULL, "authors");
    hr = ColumnSchemaRowset.MoveFirst();
    while (hr == S_OK)
    {
       hr = ColumnSchemaRowset.MoveNext();
    }
    
  3. 若要擷取資訊,請存取結構描述資料列集物件的適當資料成員,例如,ColumnSchemaRowset.m_szColumnName。 這個物件會對應至 COLUMN_NAME。 若要查看各個資料成員是對應到哪個 OLE DB 資料行,請參閱 CColumns

如需 OLE DB 樣板提供的結構描述資料列集 typedef 類別的參考 (請參閱結構描述資料列集類別和 Typedef 類別)。

如需 OLE DB 結構描述資料列集 (包含限制資料行) 的詳細資訊,請參閱《OLE 程式設計人員參考》的附錄 B:結構描述資料列集

如需如何使用結構描述資料列集類別的複雜範例,請參閱 CatDBDBViewer 範例。

如需結構描述資料列集提供者支援的詳細資訊,請參閱支援結構描述資料列集

請參閱

概念

使用存取子