网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > ADO.NET > 使用 Ado.net 获取数据库架构信息  

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

2004-08-16  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  在开发的时候有时需要获取数据库架构信息来得到数据库的一些其他信息,比如存储过程、视图、表、字段的类型、备注说明等。通过OleDb.NET数据提供程序可以比较简洁的实现这一点。
  
  一、OleDbConnection的GetOleDbSchemaTable方法
  
  在Ado.net的对象模型的该对象充当了与数据源之间的连接,通过Connection对象来连接数据库或者从数据库断开以释放宝贵的资源。这里我们需要用到的是OleDbConnection对象的GetOleDbSchemaTable 方法,
  
  定义如下:
  
  public DataTable GetOleDbSchemaTable( Guid schema,object[] restrictions);
  
  方法返回一个DataTable对象;
  
  第一个参数是OleDbSchemaGuid的枚举值,是用来指定架构信息类型,可以根据某一个值来决定所需的架构类型,如表、列、视图等,具体可以参考MSDN;
  
  第二个参数为Restrictions的参数,作为一个oject数组数据类型,起到过滤的作用,如果把第二个参数设置为null,那就返回指定的OleDbSchemaGuid枚举的所有信息了。 中国网管论坛bbs.bitsCN.com
  
  整个窗体包括:
  
  一个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); 网管bitscn_com
  
     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();
   网管u家u.bitsCN.com
     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); 网管下载dl.bitscn.com
  
  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(); 网管联盟bitsCN@com
  
       dataReader.Close();
  
     }
  
     catch(Exception ex)
  
     {
  
       MessageBox.Show(ex.ToString());
  
     }
  
     finally
  
     {
  
       if(myConn.State != ConnectionState.Closed)
  
         myConn.Close();
  
       myConn.Dispose();
  
     }
  
     return table1;
  
  }
  
  该方法返回了Customers表的架构信息,当然,如果连接到Access数据库,上面的函数只需修改一下连接字符串和查询字符串就可以正确执行。
  
  三、其他补充
  
  我们这里所说的是通过OleDb.NET来实现数据库架构信息的获取。对于特定的数据提供程序Sql Client.NET和Oracle Client.NET等还可以通过其他手段实现。
  
  比如:
  
  在Sql Server中可以通过信息架构视图来获取数据:
  
  SELECT * FROM INFORMATION_SCHEMA.TABLES 网管u家u.bitsCN.com
  
  获取表名的清单:
  
  SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
  
  获取视图名清单:
  
  SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW'
  
  还有获取列,存储过程等,具体可以查看SQL SERVER 的联机帮助。
  
  在Oracle数据库中可以通过查询Oracle数据字典来获取这些信息,具体可以参考Oracle的相关文档。
  
  

TAGs   架构   信息   数据库   获取   OleDbConnection   方法   DataTable      
 上一篇:在.NET中调用DataWindow操作数据库   下一篇:ADO.NET详细研究 -- DataReader终结篇
相关文章列表
使用 Ado.net 获取数据库架构信息 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.使用ADO.NET 和C# 处理BLOB 数据
2.使用ADO封装类的数据库程序开发实例(上)
3.ADO.NET详细研究 -- DataReader终结篇
4.用Microsoft.net实现数据库事务(1)
5.使用 Ado.net 获取数据库架构信息
6.ADO.net中数据库连接方式
7.掌握ADO.NET的十个热门技巧
8.用Microsoft.net实现数据库事务(4)
9.透过VS.NET数据窗体向导看ADO.NET
10.如何对DataTable进行检索和排序
最新推荐文章:
1.如何对DataTable进行检索和排序
2.DOTNET:LINQ与ADO.NET 3.0的创新
3..Net PetShop4.0分布式数据库设计
4.实现DataList和Repeater控件的分页显示
5.用C#对ADO.NET数据库完成简单操作
6.在VisualC#中用ListView显示数据记录
7.掌握ADO.NET的十个热门技巧
8.关于DAO数据库编程的几点经验
9.使用ADO封装类的数据库程序开发实例(上)
10.ADO.NET:通向未来之桥
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的