SQL 获得系统所有数据库的所有表以及指定数据库的指定表的字段
来源:互联网 发布:linux创建命令 编辑:程序博客网 时间:2024/05/02 14:11
获得系统所有数据库,指定数据库的所有表以及指定数据库的指定表的所有字段
select * from sys.databases
select * from information_schema.tables
select * from information_schema.columns
select * from sysobjects where name='table1'
使用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 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
获取表名的清单:
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的相关文档。
本文参考:《MSDN》、《ADO.NET Core Reference》、《Sql Server 2000联机丛书》
http://blog.csdn.net/zhzuo/category/129628.aspx
http://blog.csdn.net/zhzuo/category/129628.aspx
- SQL 获得系统所有数据库的所有表以及指定数据库的指定表的字段
- 取数据库所有表的名称及指定表中所有字段的名称SQL
- mysql删除指定数据库所有的表
- mysql 查询指定数据库所有表, 指定表所有列, 指定列所有表 所有外键及索引, 以及索引的创建和删除
- SqlServer查找指定数据库数据库下的所有表名
- entity_infy, 所有包含指定字段的表
- 数据库:读取指定表的所有列名&读取指定表某一列的所有数据
- sql server 查询所有数据库,一个数据库中所有表和表的所有字段
- sql server 查询所有数据库,一个数据库中所有表和表的所有字段
- SQL Server查询所有数据库,一个数据库中所有表和表的所有字段
- 查询在指定的数据库中所有的表名和每个表的字段名及字段类型
- 清除指定数据库各个表中所有的记录
- sqlserver2005 删除指定数据库里的所有用户表
- SQLServer2005如何删除指定数据库的所有表
- 清除指定数据库中所有表的记录
- c#--获取数据库指定表的所有列名
- sql 脚本的 指定数据库所有表的查询及指定表的所有列名的查询 / sql修改表名及修改列名称
- 动态sql,将某个指定的数据库的所有表导出
- java基础教程
- ASP.NET AJAX入门系列之:UpdateProgress控件简单介绍
- java基础教程-类
- java基础教程-继承
- JavaScript防止网页拷贝和保存的方法
- SQL 获得系统所有数据库的所有表以及指定数据库的指定表的字段
- java基础教程-对象的传递与返回
- java基础教程-异常处理
- java基础教程-包和接口
- 浅析.Net下的多线程编程
- c#中使用ARP获取mac地址
- java基础教程-输入/输出、小应用程序和其他主题
- 详谈调用winpcap驱动写arp多功能工具(一)
- java基础教程-多线程编程