电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> C#>>体验SQL语言的事务机制:

体验SQL语言的事务机制

来源:网络 | 2007-6-24 | (有3884人读过)

作为大型的企业级数据库,SQL Server2000对事务提供了很好的支持。我们可以使用SQL语句来定义、提交以及回滚一个事务。 

如下所示的SQL代码定义了一个事务,并且命名为"MyTransaction"(限于篇幅,本文并不讨论如何编写SQL语言程序,请读者自行参考相关书籍): 

DECLARE @TranName VARCHAR(20) 

Select @TranName = ’’’’MyTransaction’’’’  
BEGIN TRANSACTION @TranNameGOUSE pubs 
GO 

Update roysched 
SET royalty = royalty * 1.10 
Where title_id LIKE ’’’’Pc%’’’’ 
GO 

COMMIT TRANSACTION MyTransaction 
GO  

这里用到了SQL Server2000自带的示例数据库pubs,提交事务后,将为所有畅销计算机书籍支付的版税增加 10%。 

打开SQL Server2000的查询分析器,选择pubs数据库,然后运行这段程序,结果显而易见。 

 可是如何在C#程序中运行呢?我们记得在普通的SQL查询中,一般需要把查询语句赋值给SalCommand.CommandText属性,这里也就像普通的SQL查询语句一样,将这些语句赋给SqlCommand.CommandText属性即可。要注意的一点是,其中的"GO"语句标志着SQL批处理的结束,编写SQL脚本是需要的,但是在这里是不必要的。我们可以编写如下的程序来验证这个想法: 

//TranSql.csusing System; 
using System.Data; 
using System.Data.SqlClient; 
namespace Aspcn 

 public class DbTranSql 
 { 
  file://将事务放到SQL Server中执行 
  public void DoTran() 
  { 
   file://建立连接并打开 
   SqlConnection myConn=GetConn();myConn.Open(); 
   SqlCommand myComm=new SqlCommand(); 
   try 
   { 
    myComm.Connection=myConn; 
    myComm.CommandText="DECLARE @TranName VARCHAR(20) "; 
    myComm.CommandText+="Select @TranName = ’’’’MyTransaction’’’’ "; 
    myComm.CommandText+="BEGIN TRANSACTION @TranName "; 
    myComm.CommandText+="USE pubs "; 
    myComm.CommandText+="Update roysched SET royalty = royalty * 1.10 Where title_id LIKE ’’’’Pc%’’’’ "; 
    myComm.CommandText+="COMMIT TRANSACTION MyTransaction "; 
    myComm.ExecuteNonQuery(); 
   } 
   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() 
  { 
   DbTranSql tranTest=new DbTranSql(); 
   tranTest.DoTran(); 
   Console.WriteLine("事务处理已经成功完成。"); 
   Console.ReadLine(); 
  } 
 } 
}  


  注意到其中的SqlCommand对象myComm,它的CommandText属性仅仅是前面SQL代码字符串连接起来即可,当然,其中的"GO"语句已经全部去掉了。这个语句就像普通的查询一样,程序将SQL文本事实上提交给DBMS去处理了,然后接收返回的结果(如果有结果返回的话)。 

很自然,我们最后看到了输出"事务处理已经成功完成",再用企业管理器查看pubs数据库的roysched表,所有title_id字段以"PC"开头的书籍的royalty字段的值都增加了0.1倍。 

这里,我们并没有使用ADO.net的事务处理机制,而是简单地将执行事务的SQL语句当作普通的查询来执行,因此,事实上该事务完全没有用到.net的相关特性。 
了解.net中的事务机制 

如你所知,在.net框架中主要有两个命名空间(namespace)用于应用程序同数据库系统的交互:System.Data.SqlClient和System.Data.OleDb。前者专门用于连接Microsoft公司自己的SQL Server数据库,而后者可以适应多种不同的数据库。这两个命名空间中都包含有专门用于管理数据库事务的类,分别是 System.Data.SqlClient.SqlTranscation类和System.Data.OleDb.OleDbTranscation 类。 

就像它们的名字一样,这两个类大部分功能是一样的,二者之间的主要差别在于它们的连接机制,前者提供一组直接调用 SQL Server 的对象,而后者使用本机 OLE DB 启用数据访问。 事实上,ADO.net 事务完全在数据库的内部处理,且不受 Microsoft  分布式事务处理协调器 (DTC) 或任何其他事务性机制的支持。本文将主要介绍 System.Data.SqlClient.SqlTranscation类,下面的段落中,除了特别注明,都将使用 System.Data.SqlClient.SqlTranscation类。
C#热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号