c# 如何获取所有数据库中的表?  写清楚一点???

解决方案 »

  1.   

       获取数据库中的所有表(C#)1、sqldmo
    SQLDMO是操作SQLServer的理想的方式,如果您的数据库是SQLServer就可以考虑使用这种方式。在C#中使用SQLDMO需要添加SQLDMO的引用,然后在当前的文件中using SQLDMO;即可以使用SQLDMO。SQLDMO的对象模型大家可以在SQLServer的帮助中获得。        private void GetTabels_DMO(string strServerName,string strUser,string strPWD,string strDatabase)
            {
                SQLDMO.SQLServer Server = new SQLDMO.SQLServerClass();                 
                //连接到服务器
                Server.Connect(strServerName,strUser,strPWD); 
                //对所有的数据库遍历,获得指定数据库
                for(int i=0;i<Server.Databases.Count;i++) 
                { 
                    //判断当前数据库是否是指定数据库
                    if(Server.Databases.Item(i+1,"dbo").Name ==strDatabase) 
                    { 
                        //获得指定数据库
                        SQLDMO._Database db= Server.Databases.Item(i+1,"dbo"); 
                        //获得指定数据库中的所有表
                        for(int j=0;j<db.Tables.Count;j++) 
                        { 
                            MessageBox.Show(db.Tables.Item(j+1,"dbo").Name); 
                        } 
                    } 
                } 
            }2、adoxadox是ado Extensions for DDL and Security,是微软对ADO技术的扩展,使用它我们可以操作数据库的结构。它是一个COM组件,估计以后在ADO.NET中会增加ADOX的一些功能。如果大家需要ADOX的一些资料,我可以提供。下面的一个例子就是使用ADOX来获得当前数据库的所有表。        private void GetTables_ADOX()
            {
                //ADO的数据库连接
                ADODB.ConnectionClass cn=new ADODB.ConnectionClass();
                string ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Test;Data Source=HBXP";
                cn.Open(ConnectionString,"sa","",0);
                //操作ADOX的Catalog对象
                CatalogClass cat=new CatalogClass();
                cat.ActiveConnection=cn;
                for(int i=0;i<cat.Tables.Count;i++)
                {
                    MessageBox.Show(cat.Tables[i].Name);
                }
            }
    注意:在上面的代码中cat.ActiveConnection不能是ADO.Net中的Connection,而应该是ADO的Connection。3、ado.net中的oledbconnection在c#中我们首先会考虑使用ado.net来解决问题,如果没有方法才会考虑使用adox或者sqldmo来解决这个问题。虽然adox和sqldmo也能够解决这个问题,但是他们毕竟是com组件,在.net中使用起来和在非.net平台会有一些差异,不是很顺手。下面的示例就显示了在ado.net中的oledbconnection的方法getoledbschematable来获得数据库的架构。大家可以在msdn中看到这个方法的说明:public DataTable GetOleDbSchemaTable(
       Guid schema,
       object[] restrictions);
    参数
    schema 
    OleDbSchemaGuid 的值之一,它指定要返回的架构表。 
    restrictions 
    限制值的 Object 数组。这些值按照限制列的顺序来应用。即,第一个限制值应用于第一个限制列,第二个限制值应用于第二个限制列,依此类推。 
    返回值
    包含请求的架构信息的 DataTable。
    更多的信息大家可以查询MSDN,下面将示例如何实现。
            private void GetTables_ADONET()
            {
                //处理OleDbConnection
                string strConnectionString=@"Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB.1";
                OleDbConnection cn=new OleDbConnection(strConnectionString);
                cn.Open();
                //利用OleDbConnection的GetOleDbSchemaTable来获得数据库的结构
                DataTable dt = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, "TABLE"});
                foreach (DataRow dr in  dt.Rows)
                {
                    MessageBox.Show((String)dr["TABLE_NAME"]);
                }
                
            }4、信息架构视图信息架构视图是sql-92 标准中定义的架构视图,这些视图独立于系统表。信息架构视图的最大优点是,即使我们对系统表进行了重要的修改,应用程序也可以正常地使用这些视图进行访问。下面的示例使用信息架构视图来工作。
            private void GetTables_INFORMATION_SCHEMA()
            {
                //打开连接
                string strConnectionString=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
                sqlcn=new SqlConnection(strConnectionString);
                sqlcn.Open();
                //使用信息架构视图
                SqlCommand sqlcmd=new SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'",sqlcn);
                SqlDataReader dr=sqlcmd.ExecuteReader();
                while(dr.Read())
                {
                    MessageBox.Show(dr.GetString(0));
                }
            }5、使用系统表如果您的数据库系统是sqlserver,就可以使用如下的方式来获得当前数据库的所有表:        private void GetTables_SystemTable()
            {
                //打开连接
                string strConnectionString=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
                sqlcn=new SqlConnection(strConnectionString);
                sqlcn.Open();
                //使用信息架构视图
                SqlCommand sqlcmd=new SqlCommand("SELECT OBJECT_NAME (id) FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0",sqlcn);
                SqlDataReader dr=sqlcmd.ExecuteReader();
                while(dr.Read())
                {
                    MessageBox.Show(dr.GetString(0));
                }
            }6、使用sqlserver的存储过程“sp_tables”
    下面是“盛国军”朋友提出的使用存储过程的方法的补充代码。        public void GetTables_StoredProcedure()
            {
                //处理OleDbConnection
                string strConnectionString=@"Integrated Security=SSPI;Data Source=HBXP;Initial Catalog=Test;Provider=SQLOLEDB.1";
                OleDbConnection cn=new OleDbConnection(strConnectionString);
                cn.Open();
                //执行存储过程
                OleDbCommand cmd=new OleDbCommand("sp_tables",cn);
                cmd.CommandType=CommandType.StoredProcedure;
                OleDbDataReader dr=cmd.ExecuteReader();
                while(dr.Read())
                {
                    MessageBox.Show(dr["TABLE_NAME"].ToString());
                }
            }
      

  2.   


    USE database1 
    SELECT 
      表名   = CASE a.colorder WHEN 1 THEN c.name ELSE '' END, 
      序     = a.colorder, 
      字段名 = a.name, 
      标识   = CASE COLUMNPROPERTY(a.id,a.name,'IsIdentity') WHEN 1 THEN '√' ELSE '' END, 
      主键   = CASE 
        WHEN EXISTS ( 
          SELECT * 
          FROM sysobjects 
          WHERE xtype='PK' AND name IN ( 
            SELECT name 
            FROM sysindexes 
            WHERE id=a.id AND indid IN ( 
              SELECT indid 
              FROM sysindexkeys 
              WHERE id=a.id AND colid IN ( 
                SELECT colid 
                FROM syscolumns 
                WHERE id=a.id AND name=a.name 
              ) 
            ) 
          ) 
        ) 
        THEN '√' 
        ELSE '' 
      END, 
      类型   = b.name, 
      字节数 = a.length, 
      长度   = COLUMNPROPERTY(a.id,a.name,'Precision'), 
      小数   = CASE ISNULL(COLUMNPROPERTY(a.id,a.name,'Scale'),0) 
        WHEN 0 THEN '' 
        ELSE CAST(COLUMNPROPERTY(a.id,a.name,'Scale') AS VARCHAR) 
      END, 
      允许空 = CASE a.isnullable WHEN 1 THEN '√' ELSE '' END, 
      默认值 = ISNULL(d.[text],''), 
      说明   = ISNULL(e.[value],'') 
    FROM syscolumns a 
      LEFT  JOIN systypes      b ON a.xtype=b.xusertype 
      INNER JOIN sysobjects    c ON a.id=c.id AND c.xtype='U' AND c.name<>'dtproperties' 
      LEFT  JOIN syscomments   d ON a.cdefault=d.id 
      LEFT  JOIN sysproperties e ON a.id=e.id AND a.colid=e.smallid 
    ORDER BY c.name, a.colorder
      

  3.   

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;namespace TOTO
    {
        public class DbClass
        {
            private SqlConnection SqlConnection;        string _ConnString = "server=127.0.0.1;uid=sa;pwd=123;database=TOTO";
            //string _ConnString = "";
            /// <summary>
            /// 设置链接字符串,如果不设置,默认读取WebConfig文件的连接点
            /// </summary>
            public string ConnString
            {
                set { _ConnString = value; }
            }        string _ConfigAppSettings = "ConnString";
            /// <summary>
            /// WebConfig数据节点名称,默认为ConnString
            /// </summary>
            public string ConfigAppSettings
            {
                set { _ConfigAppSettings = value; }
            }        public DbClass()
            { 
            }        #region 初始化数据        /// <summary>
            /// 初始化数据库链接 
            /// </summary>
            private void InitConnection()
            {
                if (_ConnString == "")
                {
                    _ConnString = ConfigurationManager.ConnectionStrings["Conn_DB"].ConnectionString;
                }
                if (_ConnString != "" || _ConfigAppSettings != "")
                {
                    SqlConnection = new SqlConnection(_ConnString);
                }
            }        /// <summary>
            /// 初始化数据并打开数据库链接
            /// </summary>
            private void OpenConnection()
            {
                InitConnection();
                SqlConnection.Open();
            }        #endregion                #region 运行无结果集的Sql语句--ExecutenonQuery
            
            /// <summary>
            /// 执行无结果集的Sql语句,返回Sql影响的记录行数
            /// </summary>
            /// <param name="strSql">要执行的Sql语句</param>
            /// <returns>返回Sql影响的记录行数</returns>
            public int ExecuteNonQuery(string strSql)
            {
                try
                {
                    OpenConnection();
                    SqlCommand sqlcmd = new SqlCommand(strSql, SqlConnection);
                    return sqlcmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    SqlConnection.Close();
                }
            }        /// <summary>
            /// 执行无结果集的Sql语句,返回Sql影响的记录行数
            /// </summary>
            /// <param name="strSql">要执行的Sql语句</param>
            /// <param name="sqlParameter">Sql的参数</param>
            /// <returns>返回Sql影响的记录行数</returns>
            public int ExecuteNonQuery(string strSql, SqlParameter sqlParameter)
            {
                try
                {
                    OpenConnection();
                    SqlCommand sqlcmd = new SqlCommand(strSql, SqlConnection);
                    sqlcmd.Parameters.Add(sqlParameter);                return sqlcmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    SqlConnection.Close();
                }
            }        /// <summary>
            /// 执行无结果集的Sql语句,返回Sql影响的记录行数
            /// </summary>
            /// <param name="strSql">要执行的Sql语句</param>
            /// <param name="sqlParameter">Sql的参数集合</param>
            /// <returns>返回Sql影响的记录行数</returns>
            public int ExecuteNonQuery(string strSql, SqlParameter[] SqlParameters)
            {
                try
                {
                    OpenConnection();
                    SqlCommand sqlcmd = new SqlCommand(strSql, SqlConnection);
                    for (int i = 0; i < SqlParameters.Length; i++)
                    {
                        sqlcmd.Parameters.Add(SqlParameters[i]);
                    }
                       
                    return sqlcmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    SqlConnection.Close();
                }
            }
            
            #endregion        #region 按照ExecuteQuery方式运行sql并返回结果集        /// <summary>
            /// 运行sql并返回结果集DataSet
            /// </summary>
            /// <param name="Sql">要运行的Sql语句</param>
            /// <returns>sql运行结果集DataSet</returns>
            public DataSet ExecuteQuery(string Sql)
            {
                try
                {
                    OpenConnection();
                    DataSet ds = new DataSet();
                    new SqlDataAdapter(Sql, SqlConnection).Fill(ds);
                    return ds;
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    SqlConnection.Close();
                }
            }        /// <summary>
            /// 运行sql并返回结果集DataSet
            /// </summary>
            /// <param name="Sql">要运行的Sql语句</param>
            /// <param name="sqlParameter">Sql的参数</param>
            /// <returns>sql运行结果集DataSet</returns>
            public DataSet ExecuteQuery(string Sql, SqlParameter sqlParameter)
            {
                try
                {
                    OpenConnection();
                    DataSet ds = new DataSet();
                    SqlCommand sqlcmd = new SqlCommand(Sql, SqlConnection);
                    sqlcmd.Parameters.Add(sqlParameter);
                    new SqlDataAdapter(sqlcmd).Fill(ds);
                    return ds;
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    SqlConnection.Close();
                }
            }        /// <summary>
            /// 运行sql并返回结果集DataSet
            /// </summary>
            /// <param name="Sql">要运行的Sql语句</param>
            /// <param name="sqlParameter">Sql的参数集合</param>
            /// <returns>sql运行结果集DataSet</returns>
            public DataSet ExecuteQuery(string Sql, SqlParameter[] sqlParameters)
            {
                try
                {
                    OpenConnection();
                    DataSet ds = new DataSet();
                    SqlCommand sqlcmd = new SqlCommand(Sql, SqlConnection);
                    for (int i = 0; i < sqlParameters.Length; i++)
                    {
                        sqlcmd.Parameters.Add(sqlParameters[i]);
                    }                    
                    new SqlDataAdapter(sqlcmd).Fill(ds);
                    return ds;
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    SqlConnection.Close();
                }
            }        #endregion        #region 事务模式运行sql
            /// <summary>
            /// 事务模式运行sql语句的集合
            /// </summary>
            /// <param name="sqls">要运行sql语句的集合</param>
            public void ExecuteTran(string[] sqls)
            {
                OpenConnection();
                SqlTransaction myTrans = SqlConnection.BeginTransaction();
                SqlCommand sqlcmd = SqlConnection.CreateCommand();
                sqlcmd.Transaction = myTrans;
                try
                {
                    for (int i = 0; i < sqls.Length; i++)
                    {
                        sqlcmd.CommandText = sqls[i];
                        sqlcmd.ExecuteNonQuery();
                    }
                    myTrans.Commit();
                }
                catch (Exception e)
                {
                    try
                    {
                        myTrans.Rollback();
                        throw e;
                    }
                    catch (SqlException ex)
                    {
                        throw ex;
                    }
                }
                finally
                {
                    SqlConnection.Close();
                }
            }        #endregion        #region 获取数据预设链接的SqlCommand对象        /// <summary>
            /// 先获取数据预设链接的SqlConnection对象(未打开链接),通常使用在外部装配类的时候进行事务性处理。
            /// </summary>
            /// <returns>SqlCommand对象</returns>
            public SqlCommand GetSqlCommand()
            {
                InitConnection();
                return SqlConnection.CreateCommand();
            }        #endregion
        }
    }
      

  4.   

    各位兄弟!别复制黏贴过来啊 我查了好多资料?   SQLDMO是操作SQLServer的理想的方式,如果您的数据库是SQLServer就可以考虑使用这种方式。在C#中使用SQLDMO需要添加SQLDMO的引用,然后在当前的文件中using SQLDMO;即可以使用SQLDMO。SQLDMO的对象模型大家可以在SQLServer的帮助中获得  里面的“SQLDMO的引用”怎么添加进去的??????
      

  5.   

    C#?SQLSELECT NAME FROM SYSOBJECTS WHERE XTYPE='U'C#的话利用数据集执行上面的SQL语句
      

  6.   


    还有个问题呵?
      
     我是使用的是windows 登入?并没有设置用户名,密码???  SQl.Connect(@"20090624-1459\SQLEXPRESS", "", "");我在这句上报错?
      什么原因?
      

  7.   

    我使用的是 SQL2005 .
      

  8.   

    @"20090624-1459\SQLEXPRESS"
    改成"."或"(local)"看看
      

  9.   

    设置混合验证方式
    select   表名=name,类型=case   xtype   when   'S'   then   '系统表'   else   '用户表'   end   from   sysobjects   
    where   xtype   in('U','S')
      

  10.   

    sqlserver 用 sysobjects  
    oracle  用user_tables
      

  11.   

    源码下载:SQL对象查看器http://topic.csdn.net/u/20090926/14/6a0bf3d7-dece-46c1-ac91-001f19babd3e.html
      

  12.   

       
    SQl.Connect(@"20090624-1459\SQLEXPRESS; Initial Catalog=false;Integrated Security=true", null, null); 
     
      [Microsoft][ODBC SQL Server Driver]无效的连接字符串属性
      哪里有错啊?
      

  13.   

    ado.net 连接对象有个函数叫 GetSchema难道都没用过?
      

  14.   

    select name as 数据库名 from sysobjects where xtype='U'
      

  15.   

    select name,type from sysobjects where type='U'
    搞那么复杂做什么..直接两个DropdownList 不就能够绑定数据库和这个库的表了么
      

  16.   

    我写的不行啊,我的服务器serverName="TAYO-XGP",userName="sa",password="sa",然后在调用这个GetTabels_DMO(string strServerName,string strUser,string strPWD,string strDatabase)
    方法,不行啊?到底哪里写错错了呢?具体如下:
     private string serverName = "TAYO-XGP";
        private string userName = "sa";
        private string password = "sa";
        private string database;    public string Database
        {
            get { return database; }
            set { database = value; }
        }
    protected void Page_Load(object sender, EventArgs e)
        {
            GetTabels_DMO(serverName,userName,password,Database);
            
        }
     private void GetTabels_DMO(string serverName,string userName,string password, string strDatabase)
        {
            SQLDMO.SQLServer Server = new SQLDMO.SQLServerClass();      //连接到服务器
                   
          Server.Connect(serverName,userName,password);      //对所有的数据库遍历,获得指定数据库      for(int i=0;i<Server.Databases.Count;i++)      {          //判断当前数据库是否是指定数据库          if(Server.Databases.Item(i+1,"dbo").Name ==strDatabase)          {              //获得指定数据库              SQLDMO._Database db= Server.Databases.Item(i+1,"dbo");              //获得指定数据库中的所有表              for(int j=0;j<db.Tables.Count;j++)              {                  DropDownList1.Items.Add (db.Tables.Item(j+1,"dbo").Name);                }
               }
              }
        }