代码改变世界

数据访问技术系列课程 笔记(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 中的数据 

XxxDataReaderXxxCommand(通常是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

 

1     privatevoid Form1_Load(object sender, EventArgs e)
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可以直接被执行

属性:NameConnectionCommandType(值为DirectTable表示输出一个单一的表,不常用)、CommandTextParameters

 

3.2)Command 的重要方法

ExcuteScalar :返回一个值

ExecuteNonQuery:返回被影响的行数(除了Select语句)

ExecuteReader:返回数据行的集合 

ExecuteXmlReader:返回一个Xml的结果集,仅限于SqlCommand

 

四)返回单个值

ExcuteScalar 效率比ADO高,返回整个记录集

1)使用ExecuteScalar()方法

2)ADO.NET ADO效率更高,返回整个记录集

3)示例 

  一个特定产品的库存数量

  有多少个产品

  使用COUNTMAXMINAVERAGE 

 

五)返回数据行

ExecuteReader ()   使用ExecuteReader 获取数据

1Read方法 

得到下一行 ,如果还有后续的数据行存在,返回true ,否则返回false 

2)Item属性 

Read["colunName"] 或者 read[columnPosition]

3)GetXxx 方法 如:GetString GetInt32 (以基数零开始)

4)GetValues 方法 

一次返回所有的列(一个数组) 高效

5)IsDbNull 方法

用于测试是否返回NULL

6Close方法

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

 

privatevoid btnDataReader_Click(object sender, EventArgs e)
{
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);
}
}

 

六)不返回值

1ExecuteNonQuery 方法 

2执行DDLDCL语句 

       – CREATE/ALTER/DROP 

       – GRANT/DENY/REVOKE 

3执行其它DML语句 

       – INSERT/UPDATE/DELETE

 

七)使用参数

Command 命令行参数

1)SQl语句和存储过程可以有输入输出参数以及返回值

2)Command对象参数用来设置或者返回这些参数

3)SqlParameterOleDbParameter

4ParameterName

参数的名称。例如:@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实现事务

BEGINTRANCOMMITTRANROLLBACKTRAN

代码示例:

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实现本地事务:

 

privatevoid btnBgnTrn_Click(object sender, EventArgs e)
{
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();
}
}
}