zoukankan      html  css  js  c++  java
  • 访问数据库

    1. 连接数据库

      在做项目的时候,我们都需要通过程序来访问SQL Server

       通过ADO.NET 这一技术,我们可以在程序中,向数据库提交执行SQL语句的一堆类。

       本机访问直接访问“Windows验证”,但是一般项目都是单独的数据库服务器,程序在另外一台电脑上连接SQLServer,保障安全操作。

       在做项目过程中不要启用sa账户,而是建立专用的账户,这是基于安全考虑。

      

      启用sa账户的方法:进入属性页面后,可以启用sa账户和修改密码

       

    2. 连接数据库的字符串  

    在C#代码中,用来连接数据库的字符串格式:

    Data Source=127.0.0.1,1433;

    Initial Catalog=mydb;  

    User ID=sa;  

    Password=123456

      Data Source 要连接的数据库的IP地址和端口,IP地址,端口,IP地址必须填写,端口可以不填写。连接本机的话填 或者127.0.0.1 就可以了;  其他机子的话,填写IP地址,如192.168.1.100。

      Initial Catalog 要访问的数据库名

      User ID  用户名

      Password  密码

    3. 使用代码连接数据库

      要想使用SqlConnection类 必须引用下面的命名空间: using System.Data.SqlClient;

      通过SqlConnection类创建到SQLServer的连接,SqlConnection代表一个数据库连接。

      string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012";
        using (SqlConnection conn = new SqlConnection(strConn))
      {   conn.Open();
         // do something   }

      为什么连接数据库的时候,使用了关键字 using ?

      1. 通过使用using,可以达到简化资源释放的目的,凡是继承了IDisposable 接口的类都可以通过using来达到自动释放资源的目的。执行到 } 这里的时候,就会自动执行释放资源的方法。我们不必再写close()、Dispose()等方法来关闭和释放资源。这也是微软提供的一个简化资源释放的方式。

      2. 如果数据库的连接一直被占用的话,假如占用的客户端很多时,服务器就会不堪重负了。另外,由于网络的不稳定性,容易造成不必要的麻烦。所以在需要对数据库进行操作的时候,去开启数据库的连接,不需要的时候及时地关闭。这样服务器就可以同时承受更多客户端的访问。

     

     1             string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012";
     2             using (SqlConnection conn = new SqlConnection(strConn))
     3             {
     4                 conn.Open();
     5                 //通过SqlCommand类向数据库发出指令
     6                 using (SqlCommand cmd = conn.CreateCommand())
     7                 {
     8                     //直接拼接字符串的查询语句,在输入 1' or '1' = '1 后,会出现SQL注入漏洞攻击
     9                     //cmd.CommandText = "select Salary from T_Staff WHERE Name = '" + tBoxStaffName.Text + "'";
    10 
    11                     //可以拥有多个参数
    12                     cmd.CommandText = "select Salary from T_Staff where Name = @Name and Age = @Age";
    13                     //需要对多个参数进行依次赋值
    14                     cmd.Parameters.Add(new SqlParameter("@Name", tBoxStaffName_Copy.Text));
    15                     cmd.Parameters.Add(new SqlParameter("@Age", tBoxStaffAge.Text));
    16 
    17                     //用来从服务器中读取数据的类
    18                     using (SqlDataReader reader = cmd.ExecuteReader())
    19                     {
    20                         while (reader.Read())
    21                         {
    22                             MessageBox.Show(tBoxStaffName_Copy.Text + "的年龄是" + tBoxStaffAge.Text + ",工资是:" + reader["Salary"]);
    23                         }
    24                     }
    25                 }
    26             }

    4. SQLCommand类

      向数据库发出指令的类

       要执行的SQL语句存储在 CommandText 这个属性中。

       常用的方法:

        1. void ExecuteNonQuery()   一般用来执行Update、Delete、Insert类型的sql语句 ,也就是执行非查询类型的sql语句。

        2. Object ExecuteScalar()  返回一个Object类型的值,一般用来执行只有一行或一列的返回值的SQL语句。

        3. SqlDataReader ExecuteReader()  用来执行有多条查询结果的SQL语句。

    5. SQLDataReader类 

      通过它,我们可以从服务器中读取数据,一般来说这些数据会比较大。它所获得的查询结果是放在数据库中的,如果将这些数据传到客户端的话,会占用客户端太多的内存。所以这个类在查询结果数据量较大的时候使用。

      读取这些数据的方法:

      我们可以通过索引器或者GetString、GetInt32等方法来获取数据。

      注意:

        1.  通过索引器来读取数据时,获取的数据的类型是Object类型,在项目中要将这些数据强转为对应的类型。

        2.  使用SQLDataReader来读取数据时,必须保证客户端与数据的连接不能断开;也就是说,我们必须在打开数据库连接之后,释放数据库连接之前使用它。

      while ( reader.Read() )
        {
                Console.WriteLine( reader[0] ): //获取第一列的数据
                Console.WriteLine( reader["Name"] ):   //获取列名为Name这一列的数据
                Console.WriteLine( reader.GetString(1) ): //第2列为string类型,获取第2列的数值,string类型
       }

      初始时,指针指向第一条数据之前,每调用一次 reader指针向下移动一格,只要没有移动到最后一格之后,Read() 的返回值就为true。

      每调用一次Read(),reader就会从数据库中获取一条数据,并且传送到客户端上。所以在我们停止获取数据之前,必须保证数据库的连接不能断开。

        

    6. DataSet类

       它相当于一个复杂集合,如 List

       与SqlDataReader 不同的是,我们需要先将数据从服务器传送到客户端的DataSet中,然后客户端直接从这里面获取数据。所以,在所查询的数据量较小的时候,使用DataSet可以减轻服务器的负担。

      使用DataSet来读取数据:

     1             string strConn = "Data Source=127.0.0.1,1433;Initial Catalog=MyTest;User ID=sa;Password=sqlserver2012";
     2             using (SqlConnection conn = new SqlConnection(strConn)) 
     3             {
     4                 conn.Open();
     5                 using (SqlCommand cmd = conn.CreateCommand()) 
     6                 {
     7                     cmd.CommandText = "select * from T_Staff";
     8 
     9                     //SqlDataAdapter是一个帮我们把SqlCommand查询结果填充到DataSet中的类
    10                     SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    11                     //DataSet相当于本地的一个复杂的集合(就像List一样)
    12                     DataSet dataSet = new DataSet();
    13                     //执行查询语句,并且将查询结果填充到DataSet中
    14                     adapter.Fill(dataSet);
    15 
    16                     //把查询的结果放入表中
    17                     DataTableCollection tableColl = dataSet.Tables;
    18                     DataTable table = tableColl[0];
    19                     //集合中放的是每一行的数据
    20                     DataRowCollection rowsColl = table.Rows;
    21 
    22                     //使用循环来获取每一行的数据
    23                     foreach (DataRow row in rowsColl)
    24                     {
    25                         lStaff.Add(new Staff()
    26                         {
    27                             Name = (string)row["Name"],
    28                             Age = (int)row["Age"],
    29                             Sex = (bool)row["Sex"],
    30                             Height = (decimal)row["Height"],
    31                             Salary = (decimal)row["Salary"],
    32                             Department = (string)row["Department"]
    33                         });
    34                     }
    35                 }
    36             }

      

    7. SQL语句参数化查询

      采用直接拼接sql语句字符串的方法

       cmd.CommandText = "select Salary from T_Staff WHERE Name = '" + tBoxStaffName.Text + "'";

       这里的tBoxStaffName.Text 通常是客户端的文本框上的内容,这样做容易出现SQL注入漏洞攻击。

         cmd.CommandText = "select Salary from T_Staff WHERE Name = '1' or '1' = '1'";

       执行上的语句后,会把表中所有员工的工资都查出来,造成了数据的泄漏。

       为了避免这样的问题,我们使用参数化查询。

       1. 先将参数放入sql语句中,参数的格式: @Name ,必须以@开头

       2. 对参数进行赋值

                        //直接拼接字符串的查询语句,在输入 1' or '1' = '1 后,会出现SQL注入漏洞攻击
                        //cmd.CommandText = "select Salary from T_Staff WHERE Name = '" + tBoxStaffName.Text + "'";
    
                        //可以拥有多个参数
                        cmd.CommandText = "select Salary from T_Staff where Name = @Name and Age = @Age";
                        //需要对多个参数进行依次赋值
                        cmd.Parameters.Add(new SqlParameter("@Name", tBoxStaffName_Copy.Text));
                        cmd.Parameters.Add(new SqlParameter("@Age", tBoxStaffAge.Text));

       注意:参数不能用来替换表名、列名、select之类的关键字等。

  • 相关阅读:
    设计模式-11-代理模式
    设计模式-10-装饰者
    设计模式-9-组合
    设计模式-8-适配器
    设计模式-7-原型模式
    设计模式-6-建造者
    设计模式-5-单例模式
    u-boot-1.1.6 设置新分区支持设备树
    u-boot-2014.10移植(8)重定位,支持NAND启动
    u-boot-2014.10移植(7)修改环境变量的存储位置
  • 原文地址:https://www.cnblogs.com/lcxBlog/p/4518298.html
Copyright © 2011-2022 走看看