C#进阶ADO.NET基础一 基本概念、数据库连接操作基础
2015-06-07 00:05
986 查看
一、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
连接数据库:
连接字符串: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中,完整代码如下:
命令对象的SQL语句执行方法:
1)ExecuteNonQuery:一般用在执行非查询SQL语句,删、改、插,返回受影响的行数int
2)ExecuteScalar: 一般用在执行只有一行一列返回值的查询语句(select),返回第一行第一列的内容,返回值object类型
3)ExecuteReader:一般用在执行有多行查询结果的SQL语句,返回一个SqlDataReader对象,注意:查询结果放在数据库中,没有在程序中
SqlDataReader对象reader,调用read()方法,逐条读取查询结果,返回值是bool类型,如果还没读取完,返回true
读取数据完整代码:
reader的get方法,参数int n为读取查询数据的第n列,返回值以第n列的值类型而定
四、参数化查询:避免SQL注入漏洞攻击
当用控件内容加入SQL执行语句时:
如果控件内容是: 1' or '1'='1
SQL就变成了:
因为’1‘ =’1‘ 是一直成立的,这样条件过滤器一直未true,执行的结果是数据库中所有数据。
比如某个用户想查询自己的用户名和密码,结构通过注入漏洞,就可以查询到所有人的账户密码。这是很危险的
所以在给SQL传参数时不能用拼字符串的方式。要用“查询参数”来将参数传入SQL语句!
参数化查询:
1、在SQL语句中挖一个坑:@+坑的名字
2、通过数据库连接对象的命令对象的只读属性Parameters给坑传参。
第一种方法:
第二种方法:比较符合编程理念
参数化查询可以传多个参数:
参数化 传参不止用在查询语句,还可以用在插入语句、删除语句、修改语句
插入语句:insert into .....values(“@name”,“@age”)
删除语句:delete .....where Name=@name or
Age=@age
修改语句:update T_Student set Age=@myAge
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
连接数据库:
string str = @"Data Source=.;Initial Catalog=MyTest;Persist Security Info=True;User ID=sa;Password=123"; //数据库验证字符串 using(SqlConnection conn = new SqlConnection(str)) { conn.Open();
//数据库操作 }
连接字符串: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中,完整代码如下:
using(SqlConnection conn = new SqlConnection(str)) { conn.Open(); //数据库操作 //调用连接对象conn的CreateCommand方法,创建一个向数据库发命令(Command)类的对象,调用此对象的属性和方法完成数据库操作 using (SqlCommand cmd = conn.CreateCommand()) { //命令类对象的属性:CommandText,是设置要执行的SQL语句 cmd.CommandText = "Insert into T_Student(Name,Age) values('xxx',40)"; //调用方法:ExecuteNonQuery,是执行SQL语句,并返回受影响的行数,返回值int类型 cmd.ExecuteNonQuery(); } }
命令对象的SQL语句执行方法:
1)ExecuteNonQuery:一般用在执行非查询SQL语句,删、改、插,返回受影响的行数int
2)ExecuteScalar: 一般用在执行只有一行一列返回值的查询语句(select),返回第一行第一列的内容,返回值object类型
3)ExecuteReader:一般用在执行有多行查询结果的SQL语句,返回一个SqlDataReader对象,注意:查询结果放在数据库中,没有在程序中
SqlDataReader对象reader,调用read()方法,逐条读取查询结果,返回值是bool类型,如果还没读取完,返回true
读取数据完整代码:
using(SqlConnection conn = new SqlConnection(str)) { conn.Open(); using(SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select * from T_Student"; //SqlDataReader也有IDisposable接口,所以可写在using中 using(SqlDataReader reader = cmd.ExecuteReader()) { //每调用一次Read(),指针往后移一位,直到数据读取完毕,返回false while(reader.Read()) { string name = reader.GetString(1); //读取第1列的值 MessageBox.Show(name); } } } }
reader的get方法,参数int n为读取查询数据的第n列,返回值以第n列的值类型而定
四、参数化查询:避免SQL注入漏洞攻击
当用控件内容加入SQL执行语句时:
cmd.CommandText = @"select Age from T_Student where Name='"+ txtName.Text.Trim()+"'";
如果控件内容是: 1' or '1'='1
SQL就变成了:
cmd.CommandText = @"select Age from T_Student where Name='1' or '1'='1'
因为’1‘ =’1‘ 是一直成立的,这样条件过滤器一直未true,执行的结果是数据库中所有数据。
比如某个用户想查询自己的用户名和密码,结构通过注入漏洞,就可以查询到所有人的账户密码。这是很危险的
所以在给SQL传参数时不能用拼字符串的方式。要用“查询参数”来将参数传入SQL语句!
参数化查询:
1、在SQL语句中挖一个坑:@+坑的名字
cmd.CommandText = @"select Age from T_Student where Name<strong>=@name</strong>";
2、通过数据库连接对象的命令对象的只读属性Parameters给坑传参。
第一种方法:
cmd.Parameters.AddWithValue("@name", txtName.Text);
第二种方法:比较符合编程理念
cmd.Parameters.Add(new SqlParameter("@Name", txtName.Text));
参数化查询可以传多个参数:
cmd.CommandText = @"select Age from T_Student where Name=@name and Age>@age"; //cmd.Parameters.AddWithValue("@name", txtName.Text); cmd.Parameters.Add(new SqlParameter("@name", txtName.Text)); 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
相关文章推荐
- 添加某一个数据库的用户名和密码
- MySQL 中文乱码(全)
- Oracle Certified Master 11g
- mysql数据库按照同一字段不同值进行排序
- 两段简单的JS代码防止SQL注入
- Oracle之constraint/index/view/sequence/grant
- mysql 用户角色权限表建立
- Ubuntu15.04下切换openJRE7到Oracle JDK8的记录,网上其他资料不全!update-alternatives!
- 将MySQL转换为MMSQLServer2008实例过程
- 数据库锁
- oracle 多表连接 内连接 外连接
- MySql备份策略规划需要考虑的问题
- 2执行简单的增删改操作
- 公开课Introduction to Data Science的关系数据库总结
- Oracle dump函数
- VS2010无法连接SQL SERVER2008
- mysql常用命令总结
- 【关系代数习题】纸上得来终觉浅——数据库学习之路(4)
- 查看MYSQL数据库中所有用户及拥有权限
- 1连接数据库