如果给出一个 Access 数据库,如何使用 .Net 通过编程的方式知道数据库里有多少个表,以及每个表名是什么?使用 ADO.Net 中的 GetSchema 方法就可以做到。
GetSchema 方法可以获取一个以 OLEDB、ODBC、Oracle 和 SqlClient 为数据源的数据库的架构信息。
还是看示例来说吧!
Dim Conn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;Data Source=C:\Access.mdb") '创建一个名为 Conn 的 OLEDB 连接对象
Dim MyDataTable As DataTable = Conn.GetSchema() '返回的架构信息采用 DataTable 的形式
MyDataTable.WriteXml("C:\Schema.xml") '将 DataTable 输出到文件
打开生成的 Schema.xml 文件,内容如下:
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<MetaDataCollections>
<CollectionName>MetaDataCollections</CollectionName>
<NumberOfRestrictions>0</NumberOfRestrictions>
<NumberOfIdentifierParts>0</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>DataSourceInformation</CollectionName>
<NumberOfRestrictions>0</NumberOfRestrictions>
<NumberOfIdentifierParts>0</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>DataTypes</CollectionName>
<NumberOfRestrictions>0</NumberOfRestrictions>
<NumberOfIdentifierParts>0</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>Restrictions</CollectionName>
<NumberOfRestrictions>0</NumberOfRestrictions>
<NumberOfIdentifierParts>0</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>ReservedWords</CollectionName>
<NumberOfRestrictions>0</NumberOfRestrictions>
<NumberOfIdentifierParts>0</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>Columns</CollectionName>
<NumberOfRestrictions>4</NumberOfRestrictions>
<NumberOfIdentifierParts>4</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>Indexes</CollectionName>
<NumberOfRestrictions>5</NumberOfRestrictions>
<NumberOfIdentifierParts>4</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>Procedures</CollectionName>
<NumberOfRestrictions>4</NumberOfRestrictions>
<NumberOfIdentifierParts>3</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>Tables</CollectionName>
<NumberOfRestrictions>4</NumberOfRestrictions>
<NumberOfIdentifierParts>3</NumberOfIdentifierParts>
</MetaDataCollections>
<MetaDataCollections>
<CollectionName>Views</CollectionName>
<NumberOfRestrictions>3</NumberOfRestrictions>
<NumberOfIdentifierParts>3</NumberOfIdentifierParts>
</MetaDataCollections>
</DocumentElement>
XML 代码中,加粗字体,就是当前数据源下数据库的架构名称。之后,可以使用:
Conn.GetSchema("MetaDataCollections")
Conn.GetSchema("DataSourceInformation")
Conn.GetSchema("DataTypes")
……
来输出每个架构的信息,其实 Conn.GetSchema() 等同于 Conn.GetSchema("MetaDataCollections")
Access 的架构名称有十个:
MetaDataCollections 可用元数据集合的列表
DataSourceInformation 关于数据提供程序引用的数据库实例的信息
DataTypes 关于数据库支持的每个数据类型的信息
Restrictions 对于每个元数据集合,存在一批可以用于限制被请求的架构信息范围的限定符
ReservedWords 适用于该种数据库查询语言的保留字
Columns 每个表中的每个字段的属性信息
Indexes 每个表中的索引字段的属性信息
Procedures 存储过程信息
Tables 每个表的名称及其属性
Views 每个查询表的名称及其属性
SQL2005 的架构名称可能有以下几个:
MetaDataCollections
DataSourceInformation
DataTypes
Restrictions
ReservedWords
Users 数据库中的所有用户和角色信息
Databases 当前数据源下所有数据库名称
Tables
Columns
StructuredTypeMembers
Views 每个视图的名称及其属性信息
ViewColumns 每个视图中的每个字段的属性信息
ProcedureParameters 每个存储过程中的每个参数信息
Procedures 每个存储过程的信息
ForeignKeys 每个外键的信息
IndexColumns 每个索引字段的信息
Indexes 每个索引的信息
UserDefinedTypes
现在可知,使用:Conn.GetSchema("Tables") 方法,便可取得到每个表的名称。