本文演示如何用 ADO.NET 中 OleDbConnection 对象的 GetOleDbSchemaTable 方法检索数据库架构信息。数据源中的架构信息包括数据库或可通过数据库中的数据源、表和视图得到的目录以及所存在的约束等。表中的架构信息包括主键、列和自动编号字段。
注意,在使用 SqlClient.SqlConnection 对象时没有与 GetOleDbSchemaTable 等价的方法。SQL Server .NET 数据提供程序通过存储过程和信息性视图展示后端架构信息。有关可通过 Microsoft SQL Server 得到的视图和存储过程的更多信息,请参见 MSDN 库中的 Transact-SQL 参考。
• | Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server 或 Windows NT 4.0 Server |
• | Microsoft Visual Studio .NET |
本文假定您熟悉下列主题:
• | Visual Studio .NET |
• | ADO.NET 基础和语法 |
OleDbConnection 对象的 GetOleDbSchemaTable 方法展示架构信息。GetOleDbSchemaTable 返回填充了架构信息的 DataTable。
GetOleDbSchemaTable 的第一个参数是架构参数,它是一个 OleDbSchemaGuid 类型的标识,指定了要返回的架构信息的类型(如表、列和主键)。第二个参数是一个限制对象数组,对 DataTable 架构中返回的行进行过滤(例如,您可以指定对表的名称、类型、所有者和/或架构的限制)。
OleDbSchemaGuid 参数指定 GetOleDbSchemaTable 方法要返回的架构表的类型。 OleDbSchemaGuid成员主要包括:
• | 列 |
• | 外键 |
• | 索引 |
• | 主键 |
• | 表 |
• | 视图 |
有关 OleDbSchemaGuid 成员的完整列表,请参见参考部分的"OleDbSchemaGuid Members"Web 站点。
DataTable 中的一个 DataColumn。OleDbSchemaGuid 参数决定了相应的限制。例如,在指定表的 OleDbSchemaGuid时,限制数组如下所示:
若要查看可用的限制,请单击以下 Microsoft Web 站点中的任一 OleDbSchemaGuid成员:
在传递限制数组的值时,对于不包含值的数组元素使用 Visual C# .NET 的 null 关键字。例如,如果要检索表的架构,使用 OleDbSchemaGuid.Tables。但是,如果指定了表,也将返回别名、同义词、视图和其他相关对象。因此,如果您希望过滤掉除表以外的所有其他对象,请对 TABLE_TYPE 使用 TABLE 限制。可以对 TABLE_CATALOG、TABLE_SCHEMA 和 TABLE_NAME 使用 null,因为您不过滤这些对象:
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new Object[] {null, null, null, "TABLE"});
OleDbSchemaGuid 类型和限制规则的对象都对应于 GetOleDbSchemaTable 方法返回的 DataTable 中的一行。每个限制列对应于 DataTable 的一列,后面是基于 OleDbSchemaGuid 字段的其他架构信息。
例如,当您使用以下代码时,返回的 DataTable的每一行是一个数据库表:
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new Object[] {null, null, null, "TABLE"});
DataTable 中返回的每一列是限制列(TABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME、TABLE_TYPE),后面是 TABLE_GUID、DESCRIPTION、TABLE_PROPID、DATE_CREATED 和 DATE_MODIFIED 的其他架构列。
若要获得列名称的列表(即字段描述符,如 TABLE_CATALOG、TABLE_SCHEMA 和 TABLE_NAME),您可以使用列的位置顺序。注意 Columns 数组的元素下标是从 0 开始的:
for (int i = 0; i < schemaTable.Columns.Count; i++) {
Console.WriteLine(schemaTable.Columns[i].ToString());
}
若要获得每一列的值(即实际的表名称,如 Categories、Customers 和 Employees),您可以使用该行的 ItemArray 的位置顺序。注意 ItemArray 数组的元素下标是从 0 开始的:
for (int i = 0; i < schemaTable.Rows.Count; i++) {
Console.WriteLine(schemaTable.Rows[i].ItemArray[2].ToString());
}
OleDbSchemaGuid.Tables将返回那些可由特定登录访问的表(包括视图)。如果指定对象数组 {null, null, null, "TABLE"},那么您的过滤结果只包括 TABLE 的 TABLE_TYPE。然后在返回的架构表中的每一行列出表名称 (TABLE_NAME)。
1. | 启动 Visual Studio .NET。 |
2. | 新建一个 Visual C# 控制台应用程序项目。默认情况下,Class1.cs 将添加到项目中。 |
3. | 打开 Class1 的代码窗口。将下面的代码粘贴到代码窗口的顶部,位于 namespace声明之上: |
4. | 在代码窗口中,将下面的代码粘贴到 Main函数中: |
5. | 修改 ConnectionString,以使用在罗斯文 (Northwind) 数据库中具有列表权限的帐户连接到您的 SQL Server 计算机。 |
6. | 按 F5 键编译并运行该项目。您会注意到表已列在控制台窗口中。 |
7. | 按 ENTER 键结束控制台应用程序并回到集成开发环境 (IDE)。 |