分享

C#进阶ADO.NET基础一 基本概念、数据库连接操作基础

 北方的白桦林 2017-08-12

一、ADO.NET的概念:.Net中用来向数据库提交执行SQL语句的一堆类

1、数据库账号问题:本机访问一般直接用“Windows验证”即可,但是一般项目中单独的数据库服务器,程序在另外一台电脑上连接SQLServer,就会要求输入密码,否则不安全

2、SQLServer验证的两种方式:

1)Windows身份验证:本机连接或者受限的局域网连接(一般忘记管理员密码或者做系统配置的情况下使用)

2)sa用户:SQLServer的最高权限管理账户,启用方法:数据库根节点--->安全性--->sa--->常规 --->修改密码。默认强制复杂密码,可以取消

基于安全考虑,生产环境时,不要用sa账户,而是针对数据库建立专用的受限账户

 

ASP.net、WinForm、WPF等连接操作数据库的技术都是用的ADO.Net

 

二、连接数据库(数据库验证)

Windows验证:Data Source=.;Database=test;Integrated Security=True

SQL验证: Data Source=.;Database=test;Integrated Security=True

连接数据库:

[csharp] view plain copy
  1. string str = @"Data Source=.;Initial Catalog=MyTest;Persist Security Info=True;User ID=sa;Password=123";  //数据库验证字符串  
  2.             using(SqlConnection conn = new SqlConnection(str))  
  3.             {  
  4.                 conn.Open();  
[csharp] view plain copy
  1. //数据库操作  
  2.           }  

连接字符串:Data Source=.;Initial Catalog=MyTest;Persist Security Info=True;User ID=sa;Password=123

Data Source:数据源,服务器,.或者127.0.0.1表示本机的SQLServer,如果是连接其他计算机的数据库,则填写服务器的ip地址

Initial Catalog:数据库名称

Persist Security Info:安全防护

User ID:数据库连接账号

Password:数据库连接密码

 

ADO.NET中通过SqlConnetion类来创建到SQLServer的连接对象,一个对象代表一个数据库连接,因为连接类SqlConnetion等资源实现了IDisposable接口,

所以可以用using来进行资源管理,而不用手动释放资源

 

三、数据库操作

数据库连接完成后,可以进行数据库操作了。

1、调用数据库连接对象的CreateCommand方法,创建一个数据库命令类SqlCommand的对象.

SqlCommand cmd = conn.CreateCommand()

2、设置cmd的CommandText属性,写入要操作的SQL语句

cmd.CommandText = "Insert into T_Student(Name,Age) values('xxx',40)";

3、调用cmd的方法,执行数据库操作

因为命令类:SqlCommand也实现了接口IDisposable,所以也可以写在using中,完整代码如下:

[csharp] view plain copy
  1. using(SqlConnection conn = new SqlConnection(str))  
  2.             {  
  3.                 conn.Open();  
  4.                 //数据库操作  
  5.                 //调用连接对象conn的CreateCommand方法,创建一个向数据库发命令(Command)类的对象,调用此对象的属性和方法完成数据库操作  
  6.                 using (SqlCommand cmd = conn.CreateCommand())  
  7.                 {  
  8.                     //命令类对象的属性:CommandText,是设置要执行的SQL语句  
  9.                     cmd.CommandText = "Insert into T_Student(Name,Age) values('xxx',40)";  
  10.                     //调用方法:ExecuteNonQuery,是执行SQL语句,并返回受影响的行数,返回值int类型  
  11.                     cmd.ExecuteNonQuery();  
  12.                 }  
  13.             }  

 

命令对象的SQL语句执行方法:
1)ExecuteNonQuery:一般用在执行非查询SQL语句,删、改、插,返回受影响的行数int

2)ExecuteScalar: 一般用在执行只有一行一列返回值的查询语句(select),返回第一行第一列的内容,返回值object类型

3)ExecuteReader:一般用在执行有多行查询结果的SQL语句,返回一个SqlDataReader对象,注意:查询结果放在数据库中,没有在程序中

SqlDataReader对象reader,调用read()方法,逐条读取查询结果,返回值是bool类型,如果还没读取完,返回true

读取数据完整代码:

[csharp] view plain copy
  1. using(SqlConnection conn = new SqlConnection(str))  
  2.             {  
  3.                 conn.Open();  
  4.                 using(SqlCommand cmd = conn.CreateCommand())  
  5.                 {  
  6.                     cmd.CommandText = "select * from T_Student";  
  7.                     //SqlDataReader也有IDisposable接口,所以可写在using中  
  8.                     using(SqlDataReader reader =  cmd.ExecuteReader())  
  9.                     {  
  10.                         //每调用一次Read(),指针往后移一位,直到数据读取完毕,返回false  
  11.                         while(reader.Read())  
  12.                         {  
  13.                             string name = reader.GetString(1); //读取第1列的值  
  14.                             MessageBox.Show(name);  
  15.                         }  
  16.                     }                    
  17.                 }  
  18.             }  

reader的get方法,参数int n为读取查询数据的第n列,返回值以第n列的值类型而定

 

四、参数化查询:避免SQL注入漏洞攻击

当用控件内容加入SQL执行语句时:

  1. cmd.CommandText = @"select Age from T_Student where Name='"+  
  2.                        txtName.Text.Trim()+"'";  

如果控件内容是: 1' or '1'='1

SQL就变成了:

  1. cmd.CommandText = @"select Age from T_Student where Name='1' or '1'='1'                          

因为’1‘ =’1‘ 是一直成立的,这样条件过滤器一直未true,执行的结果是数据库中所有数据。

比如某个用户想查询自己的用户名和密码,结构通过注入漏洞,就可以查询到所有人的账户密码。这是很危险的

所以在给SQL传参数时不能用拼字符串的方式。要用“查询参数”来将参数传入SQL语句!

参数化查询:

1、在SQL语句中挖一个坑:@+坑的名字

  1. cmd.CommandText = @"select Age from T_Student where Name<strong>=@name</strong>";  

2、通过数据库连接对象的命令对象的只读属性Parameters给坑传参。

第一种方法:

[csharp] view plain copy
  1. cmd.Parameters.AddWithValue("@name", txtName.Text);  

第二种方法:比较符合编程理念

[csharp] view plain copy
  1. cmd.Parameters.Add(new SqlParameter("@Name", txtName.Text));  


参数化查询可以传多个参数:

[csharp] view plain copy
  1. cmd.CommandText = @"select Age from T_Student where Name=@name and Age>@age";  
  2.   
  3.                     //cmd.Parameters.AddWithValue("@name", txtName.Text);  
  4.                     cmd.Parameters.Add(new SqlParameter("@name", txtName.Text));  
  5.                     cmd.Parameters.Add(new SqlParameter("@age", txtAge.Text));  


参数化 传参不止用在查询语句,还可以用在插入语句、删除语句、修改语句

插入语句:insert  into .....values(“@name”,“@age”)

删除语句:delete .....where Name=@name or Age=@age

修改语句:update T_Student set Age=@myAge

 

 

 

 

 

 

 

 

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多