数据访问技术系列课程 笔记(2) ADO.NET 连接方式进行数据访问
2011-07-06 01:19 lujiao_cs 阅读(426) 评论(0) 编辑 收藏 举报一)连接环境简介
连接环境的特点:
1)连接环境是指用户在这种环境下始终保持与数据源的连接
优点:环境易于实施安全控制;同步问题易于控制
2)数据实时性优于其他环境
3)缺点
必须保持持续的网络连接;扩展性差
连接环境下的对象模型:
1)XxxConnection
建立与数据源的连接,如SqlConnection 用于建立与Microsoft SQL Server的连接,
OleDbConnection用于建立与任何支持OLEDB 的数据源的连接
2)XxxComand
执行数据源的命令,如SqlCommand可以调用一个Microsoft SQL Server的存储过程,
XxxCommand 对象的ExecuteReader 方法可以返回一个XxxDataReader 对象
3)XxxDataReader
以只读的、前向的方式,以流的形式读取数据,例如SqlDataReader 可以读取Microsoft SQL Server 中的数据
XxxDataReader由XxxCommand(通常是SELEC命令)的ExecuteReader方法返回
4)XxxXmlReader
快速的,无缓存的,前向的方式读取XML数据
二)连接到数据源
2.1)定义连接:XxxConnection ,连接字符串用于对数据源的连接
重要参数:
Provider 连接所用的数据提供程序的种类
Data Sourse 数据库名称
Initial Catalog 要连接的数据库的名称
Integrated Security :使用Windows验证的那个用户权限
UserID/Password :登录名 密码
Persist Security Info :连接后是否传送安全信息
2.2)打开和关闭连接
Open(),Close(),Dispose()
Demo:
2 {
3 con.ConnectionString ="server=.;database =login;uid =sa;pwd =sa ";
4 //注册事件
5 con.StateChange +=new StateChangeEventHandler(stateChang);
6 }
7 privatevoid stateChang(object sender, StateChangeEventArgs e)
8 {
9 this.txtState.Text ="Original State:"+ e.OriginalState.ToString() +"\nCurrentState :"+ e.CurrentState.ToString();
10
11 if (e.CurrentState == ConnectionState.Closed)
12 {
13 this.btnClose.Enabled =false;
14 this.btnOpen.Enabled =true;
15 }
16 elseif (e.CurrentState == ConnectionState.Open)
17 {
18 this.btnClose.Enabled =true;
19 this.btnOpen.Enabled =false;
20 }
21 }
22
23 privatevoid btnOpen_Click(object sender, EventArgs e)
24 {
25 try
26 {
27 con.Open();
28 }
29 catch (Exception ex)
30 {
31 MessageBox.Show(ex.Message);
32 }
33 }
34
35 privatevoid btnClose_Click(object sender, EventArgs e)
36 {
37 try
38 {
39 con.Close();
40 }
41 catch (Exception ex)
42 {
43 MessageBox.Show(ex.Message);
44 }
45 }
SQL Server Profiler 或者活动监视器查看连接
参考:http://www.connectionstrings.com
三)创建命令
3.1)Command对象
Command对象是一个SQL语句或者存储过程的引用
Command可以直接被执行
属性:Name、Connection、CommandType(值为DirectTable表示输出一个单一的表,不常用)、CommandText、Parameters
3.2)Command 的重要方法
ExcuteScalar :返回一个值
ExecuteNonQuery:返回被影响的行数(除了Select语句)
ExecuteReader:返回数据行的集合
ExecuteXmlReader:返回一个Xml的结果集,仅限于SqlCommand
四)返回单个值
ExcuteScalar 效率比ADO高,返回整个记录集
1)使用ExecuteScalar()方法
2)ADO.NET 比ADO效率更高,返回整个记录集
3)示例
一个特定产品的库存数量
有多少个产品
使用COUNT、MAX、MIN、AVERAGE
五)返回数据行
ExecuteReader () 使用ExecuteReader 获取数据
1)Read方法
得到下一行 ,如果还有后续的数据行存在,返回true ,否则返回false
2)Item属性
Read["colunName"] 或者 read[columnPosition]
3)GetXxx 方法 如:GetString GetInt32 (以基数零开始)
4)GetValues 方法
一次返回所有的列(一个数组) 高效
5)IsDbNull 方法
用于测试是否返回NULL
6)Close方法
Read方法返回False时,应该调用Close方法关闭DataReader ,释放连接
DataReader 不关闭,连接不可以执行其它的Command, 因此要关闭。但是在 SQl Server 2005 :多活动结果集 在第一个DataReader 不关闭的情况下执行第二个DataReader
可空的的值类型:
int i = 0;
int ? j = 0; //j 可以为空
j.HasValue
返回多个结果集
1)一个存储过程可能包含多条SQl语句 :将相关的任务分组,封装业务逻辑
2)如果一个存储过程返回了多个结果集:调用nextResult方法移到下一个结果集
3)判断有多少个数据行被一个存储过程影响: 使用RecordsAffected 属性
DEMO:
{
SqlConnection con =new SqlConnection("server =.;database=login;uid=sa;pwd=sa");
SqlCommand cmd =new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText ="select id from tb_User;"+"select voteid from vote";
cmd.Connection = con;
cmd.Parameters.AddWithValue("@ParameterName", "value");
try
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
do
{
while (reader.Read())
{
//一:利用可空类型:避免在数据库里面过滤
int? i = reader.GetInt32(0);
if (i.HasValue)
{
this.comboBox1.Items.Add(reader.GetInt32(0).ToString());
}
//二:IsDBNull过滤掉空值
//if (!reader.IsDBNull(0))
//{
// this.comboBox1.Items.Add(reader.GetInt32(0).ToString());
//}
}
}while (reader.NextResult());
reader.Close();
con.Close();
this.comboBox1.SelectedIndex =0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
六)不返回值
1)ExecuteNonQuery 方法
2)执行DDL和DCL语句
– CREATE/ALTER/DROP
– GRANT/DENY/REVOKE
3)执行其它DML语句
– INSERT/UPDATE/DELETE
七)使用参数
Command 命令行参数
1)SQl语句和存储过程可以有输入输出参数以及返回值
2)Command对象参数用来设置或者返回这些参数
3)SqlParameter,OleDbParameter
4)ParameterName
参数的名称。例如:@CaId
5)DbType
连接到数据库的类型,有SQLType 和 OleDbType
6)Direction
ParameterDirection枚举集合指定的值 ,包括:
ParameterDirection.Input :输入
ParameterDirection.InputOutput :输入输出
ParameterDirection..Output :输出
ParameterDirection.ReturnValue :返回值
在.NET 里面
默认:是输入参数
输入输出:ref
只是输出:out
在SQL里面
InputOutput 和Output 对应都是 Output
添加参数:
cmd.Parameters.AddWithValue("@ParameterName","value");
cmd.Parameters[0].Direction = ParameterDirection.InputOutput;
八)实现事务
8.1)事务是一列相互关联的操作,作为一个整体成功提交或失败(提交或回滚)
8.2)ACID
Atomicity(原子) :事务或者全部提交,或者全部不提交
Consistency(一致) :事务保证了数据的完整性
Isolation(分离) :事务处理了数据操作的并发性
Durability(持续) :记载事务结束后发生系统崩溃等灾难性情况,事务设计的数据操作也将正常保存。
8.3)本地事务 :
分布式事务 :MSDPC 用到数据库 文件系统 网络操作 ;也可以用到.NET内置的(WCF支持分布式事务)
8.4)使用T-SQL实现事务
BEGINTRAN、COMMITTRAN、ROLLBACKTRAN
代码示例:
BEGIN TRAN
DECLARE @orderDetailsError int, @productError int
DELETE FROM "Order Details" WHERE ProductID = 42
SELECT @orderDetailsError = @@ERROR
DELETE FROM Products WHERE ProductID=42
SELECT @productError = @@ERROR
IF @orderDetailsError = 0 AND @productError = 0
COMMIT TRAN
ELSE
LLBACK TRAN
使用ADO.NET 管理事务
1)XxxConnection 例如 :SqlConnection BeginTransaction
2)XxxTransaction 例如 :SqlTransaction Commit RollBack
3)隔离事务
SQL Server实现本地事务:
{
con =new SqlConnection("server =.;database=login;uid=sa;pwd=sa");
//连接必须打开
con.Open();
//开始一个事务
trn = con.BeginTransaction();
SqlCommand cmd =new SqlCommand();
//设置Command执行的事务:
cmd.Transaction = trn;
cmd.CommandType = CommandType.Text;
cmd.CommandText ="select id from tb_User";
cmd.Connection = con;
cmd.ExecuteScalar();
}
privatevoid btnCommitTrn_Click(object sender, EventArgs e)
{
trn.Commit();
con.Close();
}
privatevoid btnRollBackTrn_Click(object sender, EventArgs e)
{
trn.Rollback();
con.Close();
}
}
}