基于以上认识,下面我们就开始动手写我们的第一个事务处理程序。我们可以很熟练地写出下面这一段程序:
//DoTran.csusing System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
  public class DbTran
  {
file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();
  SqlTransaction myTran=new SqlTransaction();
  try
  {
  myComm.Connection=myConn;
  myComm.Transaction=myTran;
file:// 定位到pubs数据库 
myComm.CommandText="USE pubs";
myComm.ExecuteNonQuery();
file:// 更新数据
file://将所有的计算机类图书
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
myComm.ExecuteNonQuery();// 提交事务
myTran.Commit();
  }
  catch(Exception err)
  {
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
  finally
  {
myConn.Close();
  }
}
file://获取数据连接
private SqlConnection GetConn()
{
  string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
  SqlConnection myConn=new SqlConnection(strSql);
  return myConn;
}
  }
  public class Test{public static void Main()
  {
DbTran tranTest=new DbTran();
tranTest.DoTran();
Console.WriteLine("事务处理已 经成功完成。");
Console.ReadLine();
  }
}
}

显 然,这个程序非常简单,我们非常自信地编译它,但是,出乎意料的结果使我们的成就感顿时烟消云散:
   error CS1501: 重载"SqlTransaction"方法未获取"0"参数
是什么原因呢?注意到我们初始化的代码:
SqlTransaction myTran=new SqlTransaction();

显 然,问题出在这里,事实上,SqlTransaction类并没有公共的构造函数,我们不能这样新建一个SqlTrancaction类型的变量。在事务 处理之前确实需要有一个SqlTransaction类型的变量,将该变量关联到SqlCommand类的Transcation属性也是必要的,但是初 始化方法却比较特别一点。在初始化SqlTransaction类时,你需要使用SqlConnection类的BeginTranscation()方 法:
SqlTransaction myTran; myTran=myConn.BeginTransaction();

该方法返回一个 SqlTransaction类型的变量。在调用BeginTransaction()方法以后,所有基于该数据连接对象的SQL语句执行动作都将被认为是事务MyTran的一部分。同 时,你也可以在该方法的参数中指定事务隔离级别和事务名称,如:
SqlTransaction myTran;
myTran=myConn.BeginTransaction(IsolationLevel.ReadCommitted,"SampleTransaction");

关 于隔离级别的概念我们将在随后的内容中探讨,在这里我们只需牢记一个事务是如何被启动,并且关联到特定的数据链接的。
先不要急着去搞懂我们的事务 都干了些什么,看到这一行:
myTran.Commit();

是 的,这就是事务的提交方式。该语句执行后,事务的所有数据库操作将生效,并且为数据库事务的持久性机制所保持--即 使系统在这以后发生致命错误,该事务对数据库的影响也不会消失。
对上面的程序做了修改之后我们可以得到如下代码(为了节约篇幅,重复之处已省略, 请参照前文):
//DoTran.cs……}
file://执行事务处理
public void DoTran()
{
  file://建立连接并打开
  SqlConnection myConn=GetConn();
  myConn.Open();
  SqlCommand myComm=new SqlCommand();
  file://SqlTransaction myTran=new SqlTransaction();
  file://注意,SqlTransaction类无公开的构造函数
  SqlTransaction myTran;
  file://创建一个事务
  myTran=myConn.BeginTransaction();
  try
  {
file://从此开始,基于该连接的数 据操作都被认为是事务的一部分
file://下面绑定连接和事务对象
myComm.Connection=myConn;
myComm.Transaction=myTran; file://定位到pubs数据库
myComm.CommandText="USE pubs";
myComm.ExecuteNonQuery();// 更新数据
file://将所有的计算机类图书
myComm.CommandText="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'Pc%'";
myComm.ExecuteNonQuery();
file:// 提交事务
myTran.Commit();
  }
  catch(Exception err)
  {
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
  finally
  {
myConn.Close();
  }
}
……
posted on 2010-06-25 09:47  Genchill  阅读(281)  评论(0编辑  收藏  举报