在很多情况下我们需要将指定的数据库中的所有表都列出来在使用c#进行软件开发时我们有哪些方法可是实现这个目的呢?本人对此进行概要的总结有以下中方式可以实现这个目的
1sqldmo
SQLDMO是操作SQLServer的理想的方式如果您的数据库是SQLServer就可以考虑使用这种方式在C#中使用SQLDMO需要添加SQLDMO的引用然后在当前的文件中using SQLDMO;即可以使用SQLDMOSQLDMO的对象模型大家可以在SQLServer的帮助中获得
private void GetTabels_DMO(string strServerNamestring strUserstring strPWDstring strDatabase)
{
SQLDMOSQLServer Server = new SQLDMOSQLServerClass();
//连接到服务器
ServerConnect(strServerNamestrUserstrPWD);
//对所有的数据库遍历获得指定数据库
for(int i=;i<ServerDatabasesCount;i++)
{
//判断当前数据库是否是指定数据库
if(ServerDatabasesItem(i+dbo)Name ==strDatabase)
{
//获得指定数据库
SQLDMO_Database db= ServerDatabasesItem(i+dbo);
//获得指定数据库中的所有表
for(int j=;j<dbTablesCount;j++)
{
MessageBoxShow(dbTablesItem(j+dbo)Name);
}
}
}
}
2adox
adox是ado Extensions for DDL and Security是微软对ADO技术的扩展使用它我们可以操作数据库的结构它是一个COM组件估计以后在ADONET中会增加ADOX的一些功能如果大家需要ADOX的一些资料我可以提供下面的一个例子就是使用ADOX来获得当前数据库的所有表
private void GetTables_ADOX()
{
//ADO的数据库连接
ADODBConnectionClass cn=new ADODBConnectionClass();
string ConnectionString=Provider=SQLOLEDB;Integrated Security=SSPI;Initial Catalog=Test;Data Source=HBXP;
cnOpen(ConnectionStringsa);
//操作ADOX的Catalog对象
CatalogClass cat=new CatalogClass();
catActiveConnection=cn;
for(int i=;i<catTablesCount;i++)
{
MessageBoxShow(catTables[i]Name);
}
}
注意在上面的代码中catActiveConnection不能是ADONet中的Connection而应该是ADO的Connection
3中的oledbconnection
在c#中我们首先会考虑使用来解决问题如果没有方法才会考虑使用adox或者sqldmo来解决这个问题虽然adox和sqldmo也能够解决这个问题但是他们毕竟是com组件中使用起来和在平台会有一些差异不是很顺手下面的示例就显示了在中的oledbconnection的方法getoledbschematable来获得数据库的架构大家可以在msdn中看到这个方法的说明
public DataTable GetOleDbSchemaTable(
Guid schema
object[] restrictions);
参数
schema
OleDbSchemaGuid 的值之一它指定要返回的架构表
restrictions
限制值的 Object 数组这些值按照限制列的顺序来应用即第一个限制值应用于第一个限制列第二个限制值应用于第二个限制列依此类推
返回值
包含请求的架构信息的 DataTable
更多的信息大家可以查询MSDN下面将示例如何实现
private void GetTables_ADONET()
{
//处理OleDbConnection
string mailto:strConnectionString=@%Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB;
OleDbConnection cn=new OleDbConnection(strConnectionString);
cnOpen();
//利用OleDbConnection的GetOleDbSchemaTable来获得数据库的结构
DataTable dt = cnGetOleDbSchemaTable(OleDbSchemaGuidTablesnew object[] {null null null TABLE});
foreach (DataRow dr in dtRows)
{
MessageBoxShow((String)dr[TABLE_NAME]);
}
}
4信息架构视图
信息架构视图是sql 标准中定义的架构视图这些视图独立于系统表信息架构视图的最大优点是即使我们对系统表进行了重要的修改应用程序也可以正常地使用这些视图进行访问下面的示例使用信息架构视图来工作
private void GetTables_INFORMATION_SCHEMA()
{
//打开连接
string strConnectionString=SystemConfigurationConfigurationSettingsAppSettings[ConnectionString];
sqlcn=new SqlConnection(strConnectionString);
sqlcnOpen();
//使用信息架构视图
SqlCommand sqlcmd=new SqlCommand(SELECT TABLE_NAME FROM INFORMATION_SCHEMATABLES WHERE TABLE_TYPE = BASE TABLEsqlcn);
SqlDataReader dr=sqlcmdExecuteReader();
while(drRead())
{
MessageBoxShow(drGetString());
}
}
5使用系统表
如果您的数据库系统是sqlserver就可以使用如下的方式来获得当前数据库的所有表
private void GetTables_SystemTable()
{
//打开连接
string strConnectionString=SystemConfigurationConfigurationSettingsAppSettings[ConnectionString];
sqlcn=new SqlConnection(strConnectionString);
sqlcnOpen();
//使用信息架构视图
SqlCommand sqlcmd=new SqlCommand(SELECT OBJECT_NAME (id) FROM sysobjects WHERE xtype = U AND OBJECTPROPERTY (id IsMSShipped) = sqlcn);
SqlDataReader dr=sqlcmdExecuteReader();
while(drRead())
{
MessageBoxShow(drGetString());
}
}
使用sqlserver的存储过程sp_tables
下面是盛国军朋友提出的使用存储过程的方法的补充代码
public void GetTables_StoredProcedure()
{
//处理OleDbConnection
string mailto:strConnectionString=@%Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB;
OleDbConnection cn=new OleDbConnection(strConnectionString);
cnOpen();
//执行存储过程
OleDbCommand cmd=new OleDbCommand(sp_tablescn);
cmdCommandType=CommandTypeStoredProcedure;
OleDbDataReader dr=cmdExecuteReader();
while(drRead())
{
MessageBoxShow(dr[TABLE_NAME]ToString());
}
}