日期:2012-03-29  浏览次数:20355 次

使用Ado.net获取数据库架构信息

秋 枫 2004-7-3

在开发的时候有时需要获取数据库架构信息来得到数据库的一些其他信息,比如存储过程、视图、表、字段的类型、备注说明等。通过OleDb.NET数据提供程序可以比较简洁的实现这一点。



一、OleDbConnection的GetOleDbSchemaTable方法

在Ado.net的对象模型的该对象充当了与数据源之间的连接,通过Connection对象来连接数据库或者从数据库断开以释放宝贵的资源。这里我们需要用到的是OleDbConnection对象的GetOleDbSchemaTable 方法,

定义如下:

public DataTable GetOleDbSchemaTable( Guid schema,object[] restrictions);

方法返回一个DataTable对象;

第一个参数是OleDbSchemaGuid的枚举值,是用来指定架构信息类型,可以根据某一个值来决定所需的架构类型,如表、列、视图等,具体可以参考MSDN;

第二个参数为Restrictions的参数,作为一个oject数组数据类型,起到过滤的作用,如果把第二个参数设置为null,那就返回指定的OleDbSchemaGuid枚举的所有信息了。

下面用示例程序来进行相关说明,示例界面如下:




整个窗体包括:

一个TextBox,用来输入数据库连接字符串;

一个DataGrid,用来显示架构信息;

查看按钮,点击获取架构信息。

这里以SqlServer 的Northwind数据库为例,在查看按钮事件中进行了如下处理:

private void buttonOK_Click(object sender, System.EventArgs e)

{

this.dataGridSchema.DataSource = GetSqlDbSchemaUsingOleDbConnection (this.textBoxConnString.Text.Trim());

}

通过文本框把连接字符串传入GetSqlDbSchemaUsingOleDbConnection函数,由OleDbConnection对象来连接数据库,并获取构架信息,

private DataTable GetSqlDbSchemaUsingOleDbConnection(string connString)

{

OleDbConnection myConn = new OleDbConnection(connString);

myConn.Open();

DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null);

myConn.Close();

return table1;

}

上面的函数返回数据库的所有字段,下面来看看如何通过Restrictions参数来过滤信息;

参数数据可以定义为

object[] restrictions =

new object[]{"TABLE_CATALOG","TABLE_SCHEMA","TABLE_NAME","COLUMN_NAME"};

具体可参考MSDN文档。

对上面函数进行修改,我们只获取Northwind 数据库Customers表的信息:

private DataTable GetSqlDbSchemaUsingOleDbConnection(string connString)

{

OleDbConnection myConn = new OleDbConnection(connString);

object [] restrictions = new object[]{"Northwind","dbo","Customers",null};

myConn.Open();

DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,restrictions);

myConn.Close();

return table1;

}



另外对于Access数据库架构信息的获取也可以通过上面的方法来完成,

private DataTable GetMdbSchemaUsingOleDbConnection(string connString)

{

OleDbConnection myConn = new OleDbConnection(connString);

myConn.Open();

DataTable table1 = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,null);

myConn.Close();

return table1;

}

前面的界面图示就是执行结果,这里我用的是Access 2003。



二.OleDbDataReader的GetSchemaTable方法

另外一个获取架构的方法是使用OleDbDataReader的GetSchemaTable方法,

public virtual DataTable GetSchemaTable();

该方法需要结合OleDbCommand.ExecuteReader的一个重载方法才能完成,可以设置重载方法的唯一参数,

public OleDbDataReader ExecuteReader(CommandBehavior behavior);

CommandBehavior为一枚举对象,定义为

[Flags]

[Serializable]

public enum CommandBehavior



CommandBehavior.SchemaOnly:只返回列信息,不影响数据库状态;

CommandBehavior.KeyInfo:返回列和主键信息。执行此查询时不锁定选定的行。

如果使用CommandBehavior.SchemaOnly就不需要再加CommandBehavior.KeyInfo了。

下面是演示代码:

private DataTable GetSchemaUsingOleDbDataReader(string connString)

{

OleDbConnection myConn = new OleDbConnection(connString);

DataTable table1 = null;

try

{

OleDbCommand cmd = new OleDbCommand("Select * from Customers",myConn);

myConn.Open();

OleDbDataReader dataReader = cmd.ExecuteReader(CommandBehavior.SchemaOnly);

table1 = dataReader.GetSchemaTable();

dataReader.Close();

}

catch(Exception