C# 使用 GetOleDbSchemaTable 检索架构信息(表、列、主键等)
本文演示如何用 ADO.NET 中 OleDbConnection 对象的 GetOleDbSchemaTable 方法检索数据库架构信息。数据源中的架构信息包括数据库或可通过数据库中的数据源、表和视图得到的目录以及所存在的约束等。表中的架构信息包括主键、列和自动编号字段。
注意,在使用 SqlClient.SqlConnection 对象时没有与 GetOleDbSchemaTable 等价的方法。SQL Server .NET 数据提供程序通过存储过程和信息性视图展示后端架构信息。有关可通过 Microsoft SQL Server 得到的视图和存储过程的更多信息,请参见 MSDN 库中的 Transact-SQL 参考。
OleDbConnection 对象的 GetOleDbSchemaTable 方法
OLE DB .NET 数据提供程序使用 OleDbConnection 对象的 GetOleDbSchemaTable 方法展示架构信息。GetOleDbSchemaTable 返回填充了架构信息的 DataTable。
GetOleDbSchemaTable 的第一个参数是架构参数,它是一个 OleDbSchemaGuid 类型的标识,指定了要返回的架构信息的类型(如表、列和主键)。第二个参数是一个限制对象数组,对 DataTable 架构中返回的行进行过滤(例如,您可以指定对表的名称、类型、所有者和/或架构的限制)。
OleDbSchemaGuid 成员
OleDbSchemaGuid 参数指定 GetOleDbSchemaTable 方法要返回的架构表的类型。 OleDbSchemaGuid 成员主要包括:
• | 列 |
• | 外键 |
• | 索引 |
• | 主键 |
• | 表 |
• | 视图 |
有关 OleDbSchemaGuid 成员的完整列表,请参见参考部分的"OleDbSchemaGuid Members"Web 站点。
限制
限制是一个过滤值对象数组,每个元素对应于结果 DataTable 中的一个 DataColumn。OleDbSchemaGuid 参数决定了相应的限制。例如,在指定表的 OleDbSchemaGuid 时,限制数组如下所示:
若要查看可用的限制,请单击以下 Microsoft Web 站点中的任一 OleDbSchemaGuid 成员:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataoledboledbschemaguidmemberstopic.asp(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataoledboledbschemaguidmemberstopic.asp)
在传递限制数组的值时,对于不包含值的数组元素使用 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());
}
创建列出数据库中的表的示例
以下示例列出 SQL Server Northwind 数据库中的表。
OleDbSchemaGuid.Tables 将返回那些可由特定登录访问的表(包括视图)。如果指定对象数组 {null, null, null, "TABLE"},那么您的过滤结果只包括 TABLE 的 TABLE_TYPE。然后在返回的架构表中的每一行列出表名称 (TABLE_NAME)。
1. | 启动 Visual Studio .NET。 |
2. | 新建一个 Visual C# 控制台应用程序项目。默认情况下,Class1.cs 将添加到项目中。 |
3. | 打开 Class1 的代码窗口。将下面的代码粘贴到代码窗口的顶部,位于 namespace 声明之上:
using System.Data; |
4. | 在代码窗口中,将下面的代码粘贴到 Main 函数中:
OleDbConnection cn = new OleDbConnection(); |
5. | 修改 ConnectionString,以使用在罗斯文 (Northwind) 数据库中具有列表权限的帐户连接到您的 SQL Server 计算机。 |
6. | 按 F5 键编译并运行该项目。您会注意到表已列在控制台窗口中。 |
7. | 按 ENTER 键结束控制台应用程序并回到集成开发环境 (IDE)。 |
创建检索表的架构的示例
以下示例列出 SQL Server Northwind 数据库中 Employees 表的架构信息。
OleDbSchemaGuid.Tables 将返回那些可由特定登录访问的表(包括视图)。如果指定对象数组 {null, null, "Employees", "TABLE"},那么您的过滤结果只包括名为 Employees 的表。然后列出返回的架构表的架构信息。
1. | 新建一个 Visual C# 控制台应用程序项目。默认情况下,Class1.cs 将添加到项目中。 |
2. | 打开 Class1 的代码窗口。将下面的代码粘贴到代码窗口的顶部,位于 namespace 声明之上:
using System.Data; |
3. | 在代码窗口中,将下面的代码粘贴到 Main 函数中:
OleDbConnection cn = new OleDbConnection(); |
4. | 修改 ConnectionString,以使用具有检索 Employees 表架构权限的帐户连接到您的 SQL Server 计算机。 |
5. | 按 F5 键编译并运行该项目。您会注意到表已列在控制台窗口中。 |
6. | 按 ENTER 键结束控制台应用程序并回到 IDE。 |
创建列出表中的列的示例
以下示例列出 SQL Server Northwind 数据库中 Employees 表中的列名称。
OleDbSchemaGuid.Columns 将返回那些可由特定登录访问的表和视图中的列。如果指定对象数组 {null, null, "Employees", null},您的过滤结果只包括 Employees 表中的列。
1. | 新建一个 Visual C# 控制台应用程序项目。默认情况下,Class1.cs 将添加到项目中。 |
2. | 打开 Class1 的代码窗口。将下面的代码粘贴到代码窗口的顶部,位于 namespace 声明之上:
using System.Data; |
3. | 在代码窗口中,将下面的代码粘贴到 Main 函数中:
OleDbConnection cn = new OleDbConnection(); |
4. | 修改 ConnectionString,以使用具有列出 Employees 表中各列的权限的帐户连接到您的 SQL Server 计算机。 |
5. | 按 F5 键编译并运行该项目。您会注意到 Employees 表中的列已列在控制台窗口中。 |
6. | 按 ENTER 键结束控制台应用程序并回到 IDE。 |
创建列出表中的主键的示例
以下示例列出 SQL Server Northwind 数据库的 Employees 表和 SQL Server Pubs 数据库的 Employee 表中的主键。
OleDbSchemaGuid.Primary_Keys 将返回那些可由特定登录访问的目录中的主键。在此示例中,OleDbConnection 连接到 SQL Server,而不是连接到特定的 SQL Server 数据库:
cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=sa;
Password=password;"
因为,罗斯文或 Pubs 数据库将在限制数组的 TABLE_CATALOG 中指定。此代码指定表的所有者"dbo"作为 TABLE_SCHEMA 限制。此外,代码还指定了 TABLE_NAME 限制的表名称。
若要获得罗斯文数据库中 Employees 表的主键,您可以使用 {"Northwind", "dbo", "Employees"} 对象数组:
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys,
new Object[] {"Northwind", "dbo", "Employees"});
若要获得 Pubs 数据库中 Employee 表的主键,您可以使用 {"Pubs", "dbo", "Employee"} 对象数组:
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys,
new Object[] {"Pubs", "dbo", "Employee"});
若要创建示例,可以按照下列步骤进行:
1. | 新建一个 Visual C# 控制台应用程序项目。默认情况下,Class1.cs 将添加到项目中。 |
2. | 打开 Class1 的代码窗口。将下面的代码粘贴到代码窗口的顶部,位于 namespace 声明之上:
using System.Data; |
3. | 在代码窗口中,将下面的代码粘贴到 Main 函数中:
OleDbConnection cn = new OleDbConnection(); |
4. | 修改 ConnectionString,以使用具有足够权限可列出主键的帐户连接到您的 SQL Server 计算机。 |
5. | 按 F5 键编译并运行该项目。您会注意到罗斯文数据库和 Pubs 数据库的 Employee 表的主键已列在控制台窗口中。 |
6. | 按 ENTER 键结束控制台应用程序并回到 IDE。 |
出处:http://support.microsoft.com/kb/309681/zh-cn
C# 使用 GetOleDbSchemaTable 检索架构信息(表、列、主键等)的更多相关文章
- 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句
最近在写Rafy底层的一些东西,在数据库方面把MySql数据库集成到里面去,里面有一个需求,需要获取非系统数据库,也就是我们自己建立的数据库中所有表的主键和外键元数据列表. 第一种方法:是网上的方法, ...
- 如何通过phoenix中查看表的主键信息
需求描述: 今天一个开发的同事让帮忙查看下表的主键列,在此记录下. 操作过程: 1.通过!primarykeys命令查看表的主键 !primarykeys SYNC_BUSINESS_INFO_BYD ...
- SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)
SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...
- 通过DataTable获得表的主键
转载http://www.cnblogs.com/hobe/archive/2005/10/07/249940.html 通过DataTable获得表的主键 很多情形下我们需要知道表的主键是什么.在A ...
- cassandra表中主键的类型
cassandra表中主键的类型及区分? 一.类型及区分 二.参考文章 一.类型及区分 Cassandra的4种Key Primary Key 主键 Composite Key,Compound Ke ...
- Oracle heap 表的主键 dump 分析
1. 创建heap 表: create table t1 (id char(10) primary key,a1 char(10),a2 char(10),a3 char(10)); SQL> ...
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类
http://www.cnblogs.com/lbangel/p/3487796.html 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的 ...
- 如何利用pt-online-schema-change进行MySQL表的主键变更
业务运行一段时间,发现原来的主键设置并不合理,这个时候,想变更主键.这种需求在实际生产中还是蛮多的. 下面,看看pt-online-schema-change解决这类问题的处理方式. 首先,创建一张测 ...
随机推荐
- 【Python】python list 迭代删除
最好方式使用filter,代码示例: def _filter(self, item): ): return False return True #lambda e:e%!= data['items'] ...
- http协议学习系列
深入理解HTTP协议(转) http://www.blogjava.net/zjusuyong/articles/304788.html http协议学习系列 1. 基础概念篇 1.1 介绍 H ...
- sharepoint添加应用程序
- 2013 ACM/ICPC 长沙网络赛J题
题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...
- iOS7 中的statusbar的隐藏和样式更改
ios7以前,如果想要隐藏statusbar,需要用到[UIApplicationsharedApplication].statusBarHidden = YES; 或者在plist文件中设定Stat ...
- codeforces 471B. MUH and Important Things 解题报告
题目链接:http://codeforces.com/problemset/problem/471/B 题目意思:有 n 个 tasks,编号依次为 1 - n,每个 task 都有一定的难度值来评估 ...
- ThreadGroup分析
本文为转载:http://sunboyyyl.blog.163.com/blog/static/2247381201211531712330/ 在Java中每一个线程都归属于某个线程组管理的一员,例如 ...
- 火车站(codevs 2287)
题目描述 Description 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数 ...
- editplus快捷键大全
Eclipse快捷键 10个最有用的快捷键 1. ctrl+shift+r:打开资源 ctrl+b编译 ctrl+d删除 2. ctrl+o:快速outline --->这个是查看一个类中的用 ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(2) Fresco.initializeDrawee()分析 续
4.2.1.2 Fresco.initializeDrawee()的过程 续 继续上篇博客的分析Fresco.initializeDrawee() sDraweeControllerBuilderSu ...