链接数据库的方法

Hello,我是KitStar。

以下文章整理的不对。还请见谅。


注:此文档应用于WIN应用程序的开发,不是Unity3D.并且此处使用的是SQL Server数据库。

一:    

       今天提及的是链接数据库的ADO.NET类。它是一组向.NET程序员公开数据访问服务的类。它有一系列的方法,用于支持对Microsoft SQL Server 和XML等数据源的访问。客户端可以使用ADO.NET来链接到数据源,并且查询,添加,删除和更新所包含的数据。


  ADO.NE支持无连接和链接两种模型 :

        1.无连接:即使将数据下载到客户机器上,并在客户机上将数据封装在内存里面,任何可以像访问本地关系数据库一样访问内存中的数据(eg:DataSet)。     

        2.链接模式依赖于逐记录的访问,这种访问要求打开并保持与数据源的链接,链接OVER,你的数据也就OVER.


二:

      而ADO.NET对象模型直接的关系就像一个抽水系统:


链接数据库的方法_第1张图片

(1):数据库好比水源,储存着大量的数据。

(2):Connection(连接件)对象好比深入水源的进水龙头,保持与水的接触,只有在链接到的前提下,才可以抽到水。

(3):Command(命令件)对象好比抽水机,为抽水提供动力和执行方法,先通过水龙头取得水,然后把水传给输水管。

(4):DataAdapter,DataReader(数据适配器,数据读取器)这两个对象就是输水管,担任着水的传输任务,并起着桥梁作用。而这两个是有区别的;DataAdapter对象通过抽水机,把水源输送到水池中进行保存。而DataReader对象不也不需要把水输送到水池里面,而是单向的把水直接送到需要水的用户里,所以要比在水池中转一下速度更快。

(5):DataSet(数据集)对象则是一个大水库,把抽上来的水按照一定关系的池子进行存放。即使,抽水装置撤离或者损坏(链接断开,离线状态),也可以保持“水”的存在。这也正是DAO.NET的核心。

(6):DataTable(数据表)对象则像水池中每个独立的池子,分放着不同种类的水。一个大水池由一个或者多个这样的池子组成。

三:

        那么下来具体展示代码的操作了:


(前提需要:       1.已经构建了数据库(eg:SQL Server)相应的数据源(二处描述的水),如图:链接数据库的方法_第2张图片                     2.在Microsoft Visual Studio 中建立了客户端,如图:链接数据库的方法_第3张图片

                     。此处就不讲解这两个项目的建立过程,网络上有很多资源。

)

(当然不同数据库的所引用的命名空间不同,

1.SQL Server    位于System.Data.SqlClient命名空间下。

2.ODBC            位于System.Data.OleDb命名空间下。

3.OLEDB          位于System.Data.Oabc命名空间下。

4.Oracle            位于System.Data.OracleClient命名空间下。

1.建造进水龙头

首先我们先操作Connection(连接件)对象,先把进水龙头插进水源中才能获取到水,对吧?(首先创建WIN应用程序,在窗体中添加TextBox控件,Button控件和Lable空间,然后引入System.Data.SqlClient命名空间,使用 SqlConnection类链接数据库)


using System.Data.SqlClient;  //必须要声明使用这个命名空间。

namespace FormApplicationStudent1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.AcceptButton = button1;
        }

        private void button1_Click(object sender, EventArgs e)   //当点击按钮的时候
        {
          
            if(textBox1.Text == null)     //判断数据库名称是否存在
            {
                MessageBox.Show("请输入正确的数据库名称");
            }
            else
            {
                try
                {
                    string strCon = "server=RUWENKEJI\\SQLEXPRESS;database=" + textBox1.Text.Trim() + "; uid=sa;pwd=www090924";

                      //其中server为服务器名称,database为数据库名称,uid 为用户名,pwd为密码。

                    SqlConnection conn = new SqlConnection(strCon);    //创建数据库SqlConnection对象,即我们的进水龙头
                    conn.Open();                                         //打开水龙头
                    if(conn.State == ConnectionState.Open)             //判断链接状态,如果为打开
                    {
                        Label lab = new Label();
                        lab.Location = new Point(25,25);
                        this.Controls.Add(lab);
                        lab.Text = "数据库已经链接到 :" + textBox1.Text.Trim();
                    }
                }
                catch
                {
                    MessageBox.Show("数据库连接失败","",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }
        }


  //其中server为服务器名称,database为数据库名称,uid 为用户名,pwd为密码。如图:链接数据库的方法_第4张图片


              客户端执执行后下图:链接数据库的方法_第5张图片                    此时,就打开了进水龙头。(对于关闭连接的话,通过调用SqlConnection对象的Close或者Dispose,这两个方法的主要区别: Close只是关闭了进水龙头的开关,可以通过Open再次打开。但是Dispose是直接连进水龙头都删除了,再次使用的话得从新实例个龙头,然后从新打开)。



2. 抽水机Command(命令件)

进水龙头已经准备好了,那么下来我们开始使用抽水机Command(命令件)对象来抽水,这是整个系统中最重要的一环。

   Command对象是一个数据命令对象,他的作用用比喻来说,就是过滤水的。在程序中主要是让它给数据库发送查询,更新,删除,修改操作的SQL语句。


(当然不同数据库的方法不一样,

1.SqlCommand:此处我们用的是SQL Server,用于给SQL Server发送SQL指令的方法是在System.Data.SqlClient下的SqlCommand方法 。

2.OleDbCommand :用于向使用OLEDB公开的数据库发送SQL语句。位于System.Data.OleDb命名空间下。eg:

Access数据库和MySQL数据库都是OLEDB公开的数据库

3.OdbcCommand :用于向使用ODBC公开的数据库发送SQL语句。位于System.Data.Oabc命名空间下。

4.OracleCommand :用于向使用Oracle数据库发送SQL语句。位于System.Data.OracleClient命名空间下。

   Command对象有三个重要的属性,分别是Connection,CommandText,CommandType。这三个属性中,Connection用于设置SqlCommand(抽水机)对应的SqlConnection(进水龙头),就像是摆好了抽水机得要给定他特定的抽水管一样,不然他不知道抽哪的水。CommandText属性主要就是设置要对数据源执行的SQL语句或者储存过程,也就是要发送的SQL指令,通俗点就是去告诉数据库我要得什么样的水。CommandType属性用于设置CommandText的属性,它是一个枚举类型,有三个成员 : StoredProcedure(储存过程的名称);TableDirect(表的名称);Text(SQL文本命令)


  具体操作 :首先创建WIN应用程序,在窗体中添加TextBox控件,Button控件和Lable空间,然后引入System.Data.SqlClient命名空间,使用 SqlConnection类链接数据库)


using System.Windows.Forms;
using System.Data.SqlClient;

namespace FormApplicationStudent1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.AcceptButton = button1;
        }
        SqlConnection conn;
        private void Form1_Load(object sender, EventArgs e)    //当加载窗口的时候
        {
            if (MessageBox.Show("是否查看窗体?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Information) != DialogResult.Yes)
            {
                this.Close();
            }
            string strCon = "server=RUWENKEJI\\SQLEXPRESS;database=" + "likia"+ "; uid=sa;pwd=www090924";
            conn = new SqlConnection(strCon);     //创建数据库SqlConnection对象,即我们的进水龙头
            conn.Open();                          //打开水龙头
        }
        private void button1_Click(object sender, EventArgs e)   //当点击按钮的时候
        {
              try
                {
                    if (conn.State == ConnectionState.Open || textBox1.Text != null)             //判断链接状态,如果为打开
                    {
                        SqlCommand comm = new SqlCommand();     //创建一个SqlCommand对象,即抽水机。

                        comm.Connection = conn;                                              //指定他接受的进水龙头为当前comm
                        comm.CommandText = "SELECT Count(*) FROM " + textBox1.Text.Trim();  //指定SQL指令,用来“过滤”水。这里获取表的数据数量
                        comm.CommandType = CommandType.Text;                                 //指定指令的类型,此处为text,即SQL文本命令

                        int i = Convert.ToInt32(comm.ExecuteScalar());   //获取数据表中的数据数量  ExecuteScalar(返回执行数量)


                        comm.CommandText = "SELECT * FROM " + textBox1.Text.Trim();   //指定SQL指令,用来“过滤”水。这里获取表的信息
                        comm.CommandType = CommandType.Text;                                 //指定指令的类型,此处为text,即SQL文本命令
                        SqlDataReader sqlRead = comm.ExecuteReader();
                        //ExecuteReader返回一个包含数据的SqlDataReader类型的实例。其中储存着SQL语句过滤后的数据,此处为获取全部信息


                        Label lab = new Label();
                        lab.Location = new Point(50,50);
                        this.Controls.Add(lab);
                        lab.Size = new Size(new Point(200,200));
                        lab.Text = "数据表中共有:" + i.ToString() + " 条数据";     

                        while (sqlRead.Read())    //当数据可以读取
                        {
                            lab.Text += sqlRead[1].ToString() + "  ";   //读取数据表中的第一列 即Name
                            lab.Text += sqlRead[2].ToString() + "  ";   //读取数据表中的第二列 即sex
                            

                        }
                        button1.Enabled = false;
                    }
                }
                catch
                {
                    MessageBox.Show("数据库连接失败","",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            
        }


执行后如图所示:


链接数据库的方法_第6张图片

 其中要注意SqlCommand中几种执行SQL语句的方法 :

a. ExecuteNonQuery方法: 执行SQL语句并且返回受影响的行数,在向数据库发送增,减,改的时候用到。

b. ExecuteReader方法: 上述代码中我们有用到过的。ExecuteReader返回一个包含数据的SqlDataReader类型的实例。其中储存着数据表中的数据。

c. ExecuteScalar : 上述代码也用到。他获取数据表中的数据数量 。 ExecuteScalar(返回执行数量)

其中;ExecuteReader重点讨论下:它的返回值是SqlDataReader(DataReader类型对象)。而DataReader对象是数据读取对象,如果应用程序要每次从数据库中取出最新数据,或者只是要快速的读取,并不要去修改,则可以使用次此方法。如果判断锁查询的数据表中是否有数据。

可以使用SqlDataReader方法里面的HasRows(bool类型),来判断表中是否有数据。

读取数据的话就用SqlDataReader方法里面的Read方法读取,Read方法使SqlDataReader前进到下一条记录。


3.输水管(读取数据!)

  2中介绍了SqlDataReader这一读取数据方法。此处介绍DataAdapter对象(数据适配器对象)。最开始部分我们介绍了它在系统中担任输水管的重任,是DataSet与数据源之间的桥梁。在DataSet数据源之间它是不可或缺的媒介,它用于实现与数据源之间的互通。

   1.DataAdapter提供了四个属性:

                         a.SelectCommand属性:向数据库发送查询SQL语句。

                         b.DeleteCommand属性:向数据库发送删除SQL语句。

                         c.InsertCommand属性: 向数据库发送插入SQL语句。

                        d.UpdateCommand属性:向数据库发送更新SQL语句。

   2.以及一些主要方法:

              a.Fill : 用数据填充DataSet

              b.Update : 更新数据库时,DataAdapter将调用DeleteCommandInsertCommandUpdateCommand,属 性。  可以及时的把修改过的数据更新到数据库中。再使用此方法之前,必须实例化一个CommandBuilder类,他能根据DataAdapter的  SelectCommand的SQL语句判断其他的DeleteCommand,InsertCommand,UpdateCommand

 

    3. 那么,我们现在开始抽水了,输水管也有了,现在我们用Fill把水填充到DataSet(大水库)。


                        string strCon = "server=RUWENKEJI\\SQLEXPRESS;database=" + "likia" + "; uid=sa;pwd=www090924";
                        conn = new SqlConnection(strCon);     //创建数据库SqlConnection对象,即我们的进水龙头
                        conn.Open();     
                        //打开水龙头
                        SqlCommand comm = new SqlCommand();     //创建一个SqlCommand对象,即抽水机

                        comm.Connection = conn;                                              //指定他接受的进水龙头为当前comm
                        comm.CommandText = "SELECT Count(*) FROM " + textBox1.Text.Trim();   //指定SQL指令,用来“过滤”水。这里获取表的数据数量
                        comm.CommandType = CommandType.Text;                                 //指定指令的类型,此处为text,即SQL文本命令

                        SqlDataAdapter ad = new SqlDataAdapter();   //创建输水管对象(SqlDataAdapter)
                        ad.SelectCommand = comm;                      //指定输水管的SqlCommand对象(即抽水机),这样就得到了水

                        DataSet dset = new DataSet();              //创建一个水池对象(DataSet),用来存水
                        ad.Fill(dset);                        //输水管把谁填充到水池中

                        dataGridView1.DataSource = dset.Tables[0];   //把数据给dataGridView组件,让显示信息

                       

4.水池(数据集(DataSet ))

     DataSet对象像是存放在内容的小数据库。它可以包含数据表,数据列,数据行,视图,约束以及关系。通常它的来源为数据库或者XML。而为了从数据库中获取数据,必须要DataAdapter(3中提及)。然后使用DataAdapter的Fill填充数据集。

     1.DataSet提供了一些方法:

         a.Merge :可以将DataSet,DataTable,DataRow数组的内容一起并入现有的DataSet中。

         b.Copy : 在不想修改破坏原始数据的情况下,可以创建DataSet的副本进行操作。返回一个新的DataSet。

你可能感兴趣的:(WIN应用程序)