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

原创 2013年12月02日 11:26:48

【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的绑定   
                }

版权声明:本文为博主原创文章,未经博主允许不得转载。

C#WinForm连接本地或远程Sql数据库,并进行简单操作。

在学习C#课程时,看到课本有相关内容的介绍。想起如果自己能做一个操作数据库的小软件应该不错。 所需要的知识基础就是sql的一些语句和C#的ADO.NET。 主要就是Connection、Comma...
  • hsk_scnu
  • hsk_scnu
  • 2016年06月10日 19:28
  • 8415

C# 连接SQL Server数据库的几种方式--server+data source等方式

文章出自:  http://blog.csdn.net/guoquanyou/article/details/6861536?c=be33b3c9253a85267f7a9942eb38385...
  • u011390632
  • u011390632
  • 2014年10月11日 20:00
  • 1267

数据库元数据对象

数据库元数据的获取(写数据库框架用) 1、什么是数据库元数据 元数据:数据库、表、列等定义的信息 2、元数据 数据库的元信息: a、DatabaseMetaData lConnection.g...
  • CSDN_GIA
  • CSDN_GIA
  • 2017年01月03日 08:00
  • 618

元数据

元数据(MetaData) 作者: 阮一峰 日期: 2007年3月11日 元数据是用来描述数据的数据(Data that describes ...
  • u013176681
  • u013176681
  • 2016年01月07日 15:56
  • 226

C#中winform对sql数据库的查询,删除,增加.

首先,你得有一个数据库. 然后,用C#做了数据库的界面. 最后,使用了ado.nety
  • skyjie6
  • skyjie6
  • 2014年07月09日 20:06
  • 3274

c# winform通过本地WebService接口访问SQL数据库实例

总体思路如下:先建立数据库,再建立webservice,最后通过winform的按钮来调用服务,达到操作数据库的目的。...
  • ericwuhk
  • ericwuhk
  • 2016年12月15日 17:05
  • 3636

获取数据库元数据

MySQL 提供几种办法以使获取关于数据库和数据库里各种对象(也就是数据库的元数据)的信息,如下: SHOW语句,如SHOW TABLES等等。INFORMATION_SCHEMA数据库里的...
  • zmxiangde_88
  • zmxiangde_88
  • 2012年09月24日 08:40
  • 3229

元数据

元数据概述:元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述。将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中,而将代码...
  • u014186972
  • u014186972
  • 2017年02月20日 16:40
  • 64

SQL Server数据库操作类(C#)

博文介绍的SQL Server数据库操作类是C#语言的,可实现对SQL Server数据库的增删改查询等操作。并且该操作类可实现对图片的存储,博文的最后附上如何将Image图片转换为byte[]数组类...
  • softimite_zifeng
  • softimite_zifeng
  • 2016年11月06日 11:18
  • 812

C#如何和SQL Server2008进行交互操作

C#如何和SQL Server2008进行交互呢? 首先必须得先登录数据库,而SQL Server2008提供了两种登录方式,一种是以SQLServer身份验证的形式登录(要密码);一种是以Wind...
  • u013391102
  • u013391102
  • 2015年02月03日 14:54
  • 1196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# Winform应用程序中如何进行访问SQL Server数据库的元数据
举报原因:
原因补充:

(最多只允许输入30个字)