关闭

C# Winform应用程序中如何进行访问SQL Server数据库的元数据

988人阅读 评论(0) 收藏 举报
分类:

【1】访问显示各个数据库

语法:SELECT * FROM master..sysdatabases order by name 

若要访问其数据库名称,则为:SELECT name FROM master..sysdatabases order by name 

          【例子实践】  

connstr = "Data Source=" + txtServer.Text.Trim() + ";Initial Catalog=" + cbxDatabase.Text.Trim() + ";Persist Security Info=True;User ID=" + txtUser.Text.Trim() + ";Password=" + txtPassword.Text.Trim() + "";
                SqlConnection conn = new SqlConnection(connstr);
                string sql = "sp_helpdb";

               //string sql = "sp_helpdb"; 【或者改为以下写法都是可以的:】
                string sql = "select name FROM master..sysdatabases order by name"; 

                或者:

             string sql =
                @"select name from sysdatabases
           where name not in(
            select top 4 name from sysdatabases
            )";

****************************** ************************************************
                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.Connection.Open();
                IList<string> datalist = new List<string>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    datalist.Add(dr["name"].ToString());
                }
                //获取数据库
                cbxDatabase.DataSource = datalist;
                dr.Dispose();

                cmd.Connection.Close();

>>>>>>>>>>>>>>绑定另一种方式>>>>>>>>>>>>>>>>>>>>

SqlDataReader sdr = cmd.ExecuteReader();
            while (sdr.Read())
            {
                this.cboDB.Items.Add(sdr["name"].ToString());
            }
            sdr.Close();
            conn.Close();
            this.cboDB.SelectedIndex = 0;//默认选择第一项

【2】获取所有用户名:

SELECT name FROM Sysusers where status='2' and islogin='1'
         islogin='1'表示帐户
         islogin='0'表示角色
         status='2'表示用户帐户
         status='0'表示糸统帐户

【3】获取所有表名:


             

《方法一》

SELECT Name FROM 数据库表名..SysObjects Where XType='U' ORDER BY Name
其中XType='U': 表示所有用户表;
        XType='S': 表示所有系统表;

实例:SELECT   name   FROM   sysobjects   WHERE   xtype   =   'U'   AND   name   <>   'dtproperties'

例子:SELECT Name FROM ERP_IIP..SysObjects Where XType='U' ORDER BY Name

实例:在ComboBox中显示数据库表,代码示例:cmbDataBaseName变量

《方法二》

                      

 private void btnConnect_Click(object sender, EventArgs e)
        {
            if (cbxDatabase.Text.Trim()==""||cbxDatabase.Text=="请选择")
            {
                messageInfo.MessageInfo("请您选择相应的数据库");
                messageInfo.ShowDialog();
            }
            connstr = "Data Source=" + txtServer.Text.Trim() + ";Initial Catalog=" + cbxDatabase.Text.Trim() + ";Persist Security Info=True;User ID=" + txtUser.Text.Trim() + ";Password=" + txtPassword.Text.Trim() + "";
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                string cmdText="select TABLE_NAME from INFORMATION_SCHEMA.TABLES";
                using(SqlCommand cmd=new SqlCommand(cmdText,conn))
                {
                    conn.Open();
                    using(SqlDataReader reader=cmd.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while(reader.Read())
                            {
                                string tbName=reader.GetString(0);
                                listBox1.Items.Add(tbName);  //显示在ListBox中
                            }
                            
                        } 
                      
                    }
               }
           }
       }

【4】获取某个数据库下某个表的所有字段(注:此法是在数据库中执行,应选择对应的数据库):

语法:SELECT Name FROM SysColumns WHERE id=Object_Id('表名')

【5】获取主键字段(注:此法是在数据库中执行,应选择对应的数据库):
SELECT  name FROM SysColumns WHERE id=Object_Id('表名') and colid=(select top 1 keyno from sysindexkeys where id=Object_Id('表名'))

【6】综合,如何获取数据库的表信息、视图以及存储过程【cmbDataBaseName为ComboBox的变量名字

实例(数据库中):SELECT   name   FROM   sysobjects   WHERE   xtype   =   'U'   AND   name   <>   'dtproperties'  
use ERP_IIP select  a.name from  sysobjects  a where  a.xtype='P'  and  a.status>=0 order  by  a.name 
use ERP_IIP select name from sysobjects where type='V'

在Winform中提取方法:

string sql = "SELECT   name   FROM   sysobjects   WHERE   xtype   =   'U'   AND   name   <>   'dtproperties'";
           sql +=   "  use "+cmbDataBaseName.Text+" select  a.name from  sysobjects  a where  a.xtype='P'  and  a.status>=0 order  by  a.name ";
           sql += " use " + cmbDataBaseName.Text + " select name from sysobjects where type='V'";

那么我们在Winform中分别读取,使用ds方法将有3个Table表,具体方法参考如下:

        public static string connstr = "";                               //链接字符串
        public static IList<string> mylist = new List<string>();   //绑定数据表
        public static IList<string> mylistP = new List<string>();//绑定存储过程
        public static IList<string> mylistV = new List<string>();//绑定视图
        public static string dataBaseName = "";//数据库名称

        private void btnConnect_Click(object sender, EventArgs e)//连接
        {
            if (cmbDataBaseName.Text == "")
            {
                MessageBox.Show("请选择数据库!");
                return;
            }
            connstr = "Data Source=" + txtServerName.Text.Trim() + ";Initial Catalog=" + cmbDataBaseName.Text + ";Persist Security Info=True;User ID=" + txtUsername.Text.Trim() + ";Password=" + txtPwd.Text + "";
            SqlConnection oleConn = new SqlConnection(connstr);//链接数据库
            string sql = "SELECT   name   FROM   sysobjects   WHERE   xtype   =   'U'   AND   name   <>   'dtproperties'";
            //数据表信息(用户定义,除去系统表)

            sql +=   "  use "+cmbDataBaseName.Text+" select  a.name from  sysobjects  a where  a.xtype='P'  and  a.status>=0 order  by  a.name ";
            //数据库的存储过程

            sql += " use " + cmbDataBaseName.Text + " select name from sysobjects where type='V'";
            //数据库表的视图信息

            SqlCommand oleCmd = new SqlCommand(sql, oleConn);
            try
            {
                //oleConn.Open(); //均可
                oleCmd.Connection.Open();
            }
            catch
            {
                MessageBox.Show("数据库连接失败!");
                return;
            }
            mylist.Clear();
            mylistP.Clear();
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(oleCmd);
            da.Fill(ds);  //其中有三个信息表
            //注意表信息的顺序。
            //获取表
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                mylist.Add(ds.Tables[0].Rows[i]["name"].ToString());
            }

            //获取存储过程
            for (int j = 0; j < ds.Tables[1].Rows.Count; j++)
            {
                mylistP.Add(ds.Tables[1].Rows[j]["name"].ToString());
            }

            //获取视图
            for (int k = 0; k < ds.Tables[2].Rows.Count; k++)
            {
                mylistV.Add(ds.Tables[2].Rows[k]["name"].ToString());
            }

            this.DialogResult = DialogResult.OK;
            dataBaseName = cmbDataBaseName.Text;  
            oleCmd.Connection.Close(); 
        }

【7】一些通用的方法:

 获取数据库:connstr = "Data Source=" + txtServerName.Text.Trim() + ";Initial Catalog=master;Persist Security Info=True;User ID=" + txtUsername.Text.Trim() + ";Password=" + txtPwd.Text + "";
              SqlConnection conn = new SqlConnection(connstr);

数据库命令:string sql = "sp_helpdb";
                      SqlCommand cmd = new SqlCommand(sql, conn);

获取数据中的表: string cmdText="select TABLE_NAME from INFORMATION_SCHEMA.TABLES";

获取表中的字段:string strSql = "select Column_name,is_nullable,data_type from INFORMATION_SCHEMA.COLUMNS where table_name=@tbName";

【8】获取表的相关信息【所有表字段及字段中文描述】☆☆

【方法一示例】获取表中的列名

 string strSql = "select Column_name,is_nullable,data_type from INFORMATION_SCHEMA.COLUMNS where table_name=@tbName";

【方法二示例】

 //声明集合:存放表内的所有列名
            List<string> lst1 = new List<string>();
            #region 查询该表内所有的列名
            SqlConnection conn = new SqlConnection("server=.;database=" + this.cboDB.Text + ";uid=sa;pwd=admin@123456");
            conn.Open();
            string sql = "select * from " + this.cboTable.Text; //表名
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataReader sdr = cmd.ExecuteReader(
CommandBehavior.KeyInfo);
            for (int i = 0; i <
sdr.FieldCount; i++)
            {
               
string propName = sdr.GetName(i);
                lst1.Add(propName);

            }
            sdr.Close();
            conn.Close();
            #endregion

【方法三示例】

SELECT a.colorder N'字段序号',

a.name N'字段名',

(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 

then '√'else '' end) N'标识',

(case when (SELECT count(*) FROM sysobjects WHERE (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))))))) 

AND (xtype = 'PK'))>0 then 'yes' else '' end) N'主键', b.name N'类型', a.length N'占用字节数', COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度', isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数',

(case when a.isnullable=1 then '√'else '' end) N'允许空',isnull(e.text,'') N'默认值', 

isnull(g.[value],'') AS N'字段说明'   

FROM syscolumns a left join systypes b  on a.xtype=b.xusertype 

inner join sysobjects d  on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' 

left join syscomments e on a.cdefault=e.id 

where d.name='" + tablename【表名】 + "'order by object_name(a.id),a.colorder

【实例】

  #region 公共函数,获取表的相关信息
        private static void GetTableComm(string tablename, out SqlConnection conn, out DataTable dt)
        {
            string sql = "SELECT a.colorder N'字段序号',a.name N'字段名',(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) N'标识',(case when (SELECT count(*) FROM sysobjects WHERE (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))))))) AND (xtype = 'PK'))>0 then 'yes' else '' end) N'主键', b.name N'类型', a.length N'占用字节数', COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度', isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数',(case when a.isnullable=1 then '√'else '' end) N'允许空',isnull(e.text,'') N'默认值'  FROM syscolumns a left join systypes b  on a.xtype=b.xusertype inner join sysobjects d  on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' left join syscomments e on a.cdefault=e.id where d.name='" + tablename + "'order by object_name(a.id),a.colorder";
            conn = new SqlConnection(connect.connstr);
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Connection.Open();
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds);
            dt = ds.Tables[0];
        }
        #endregion

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 #region 获取表的字段信息
        public IList<string> GetTableColumns(string tablename)
        {
            SqlConnection conn;
            DataTable dt;
            GetTableComm(tablename, out conn, out dt);
            IList<string> list1 = new List<string>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                list1.Add(dt.Rows[i]["字段名"].ToString() + "(" + dt.Rows[i]["类型"].ToString() + "," + dt.Rows[i]["占用字节数"].ToString() + ")");
            }  
            conn.Close();
            return list1;
        }
        #endregion


        #region 获取表的字段名称
        public IList<string> GetTableColumnsName(string tablename)
        {
            SqlConnection conn;
            DataTable dt;
            GetTableComm(tablename, out conn, out dt);
            IList<string> list1 = new List<string>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                list1.Add(dt.Rows[i]["字段名"].ToString());
            }
            conn.Close();
            return list1;
        }
        #endregion

《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

               //加载字段到checkboxlist
                IList<string> list1 = dataop.GetTableColumnsName(e.Node.Name);
                //获取表的字段名称
                for (int j = 0; j < list1.Count; j++)
                {
                    chklColumn.Items.Add(list1[j], true);  // checkedListBox的绑定   
                }

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:231276次
    • 积分:4578
    • 等级:
    • 排名:第6667名
    • 原创:210篇
    • 转载:121篇
    • 译文:1篇
    • 评论:11条
    最新评论