用架构行集合获取元数据
有时需要不必打开行集合即可获得有关提供程序、行集合、表、列或其他数据库信息的信息。 有关数据库结构的数据被称为元数据,可以通过多种不同的方法来检索元数据。 一种方法是使用架构行集合。
OLE DB 模板提供一组类,以检索架构信息;这些类创建预定义的架构行集,并且列在架构行集类和 Typedef 类中。
注意
如果正在使用 OLAP,而架构行集类不支持某些行集合(例如,具有可变的列数),则应考虑使用 CManualAccessor
或 CDynamicAccessor
。 可以滚动浏览这些列,并使用 case 语句来处理每个列可能的数据类型。
目录/架构模型
ANSI SQL 定义数据存储区的目录/架构模型;OLE DB 使用此模型。 在此模型中,目录(数据库)包含架构而架构包含表。
目录目录是数据库的另一个名称。 它是相关架构的集合。 若要列出属于给定数据源的目录(数据库),请使用 CCatalog。 由于很多数据库只有一个目录,元数据有时称为架构信息。
架构架构是特定用户拥有或创建的数据库对象的集合。 若要列出给定用户拥有的架构,请使用 CSchemata。
在 Microsoft SQL Server 和 ODBC 2.x 术语中,架构是所有者(例如,dbo 是典型的架构名称)。 此外,SQL Server 将元数据存储在一组表中:一个表包含所有表的列表,另一个表中包含所有列的列表。 Microsoft Access 数据库中的架构没有等效项。
表表是以特定顺序排列的列的集合。 若要列出给定目录(数据库)中定义的表和有关这些表的信息,请使用 CTables。
限制
查询架构信息时,可以使用限制来指定感兴趣的信息类型。 可以将限制视为筛选器或查询中的限定符。 例如,在查询中:
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
,将所需的表名指定为第三个限制参数,如下例所示。
若要使用架构行集合
包括头文件
Atldbsch.h
(还需要Atldbcli.h
以获得使用者支持)。实例化使用者的或文档的头文件中的架构行集合对象。 如果需要表信息,则声明
CTables
对象;如果需要列信息,则声明CColumns
对象。 此示例演示如何检索作者表中的列: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 程序员参考中的附录 B:架构行集。
有关如何使用架构行集类的更复杂的示例,请参阅 CatDB 和 DBViewer 示例。
有关针对架构行集的提供程序支持的信息,请参阅支持架构行集。