返回首页
当前位置: 主页 > 网络编程 > .Net实例教程 >

ADO.NET级别的事务处理教程

时间:2011-06-01 19:04来源:知行网www.zhixing123.cn 编辑:麦田守望者

现在我们对事务的概念和原理都有所了解了,并且作为已经有一些基础的C#开发者,我们已经熟知编写数据库交互程序的一些要点,即:
(1)使用SqlConnection类的对象的Open()方法建立与数据库服务器的连接。
(2)然后将该连接赋给SqlCommand对象的Connection属性。
(3)将欲执行的SQL语句赋给SqlCommand的CommandText属性。
(4)通过SqlCommand对象进行数据库操作。
创建一个ADO.NET事务是很简单的,需要定义一个SqlTransaction类型的对象。SqlConnection 和OleDbConnection对象都有一个 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 对象。然后赋给SqlCommand对象的Transcation属性,即实现了二者的关联。为了使事务处理可以成功完成,必须调用SqlTransaction对象的Commit()方法。如果有错误,则必须调用Rollback()方法撤销所有的操作。
基于以上认识,下面我们就开始动手写一个基于ADO.NET的事务处理程序。
(示例位置:光盘\code\ch05\04\Web\WebForm2)
string conString = "data source=127.0.0.1;database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString);
myConnection.Open();
//启动一个事务
SqlTransaction myTrans = myConnection.BeginTransaction();
//为事务创建一个命令
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "update P_Product set Name='电脑2' where Id=52";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "update P_Product set Name='电脑3' where Id=53";
myCommand.ExecuteNonQuery();
myTrans.Commit();//提交
Response.Write("两条数据更新成功");
}
catch (Exception ex)
{
myTrans.Rollback();//遇到错误,回滚
Response.Write(ex.ToString());
}
finally
{
myConnection.Close();
}
ADO.NET事务的优势和限制如下。
优势:
l 简单。
l 和数据库事务差不多快。
l 事务可以跨越多个数据库访问。
l 独立于数据库,不同数据库的专有代码被隐藏了。
限制:事务执行在数据库连接层上,所以需要在执行事务的过程中手动地维护一个连接。

注 意
所有命令都必须关联在同一个连接实例上,ADO.NET事务处理不支持跨多个连接的事务处理。

 

ASP.NET事务可以说是在.NET平台上事务实现方式最简单的一种,你仅仅需要一行代码即可。在aspx的页面声明中加一个额外的属性,即事务属性Transaction="Required",它有如下的值:Disabled(默认)、NotSupported、Supported、Required和RequiresNew,这些设置和COM+及企业级服务中的设置一样,典型的一个例子是如果你想在页面上下文中运行事务,那么要将其设置为Required。如果页面中包含有用户控件,那么这些控件也会包含到事务中,事务会存在于页面的每个地方。
(示例位置:光盘\code\ch05\04\ Web\WebForm3.aspx)
页面声明Transaction="Required":
<%@ Page Transaction="Required" Language="C#"
CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication4.WebForm3" %>
页面引用:using System.EnterpriseServices;。
然后,数据操作代码:
protected void Button1_Click(object sender, EventArgs e)
{
try
{
Work1();
Work2();
ContextUtil.SetComplete(); //提交事务
}
catch (System.Exception except)
{
ContextUtil.SetAbort(); //撤销事务
Response.Write(except.Message);
}
}
private void Work1()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('1',
'test1')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
private void Work2()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('2',
'test2')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
ContextUtil是用于获取 COM+ 上下文信息的首选类。由于此类的成员全部为static,因此在使用其成员之前不需要对此类进行实例化。
ASP.NET页面事务的优势和限制如下。
l 优势:实现简单,不需要额外的编码。
l 限制:页面的所有代码都是同一个事务,这样的事务可能会很大,而也许我们需要的是分开的、小的事务实现在Web层

------分隔线----------------------------
标签(Tag):C# C#实例教程 c#基础教程 C#源代码
------分隔线----------------------------
推荐内容
猜你感兴趣