访问数据库

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语句。

 

4. SQLDataReader类 

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

  读取这些数据的方法:

  我们可以通过索引器或者GetString、GetInt32等方法来获取数据。注意,通过索引器来读取数据时,获取的数据的类型是Object类型,在项目中要将这些数据强转为对应的类型。

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

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

技术分享

    

5. 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之类的关键字等。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。