简单介绍C 简单介绍春节
创始人
2024-04-26 04:10:52
0

体验SQL语言的事务机制

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

如下所示的SQL代码定义了一个事务,并且命名为"MyTransaction

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

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

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

  1. //TranSql.csusingSystem;  
  2. usingSystem.Data;  
  3. usingSystem.Data.SqlClient;  
  4. namespaceAspcn  
  5. {  
  6. publicclassDbTranSql  
  7. {  
  8. file://将事务放到SQLServer中执行  
  9. publicvoidDoTran()  
  10. {  
  11. file://建立连接并打开  
  12. SqlConnectionmyConn=GetConn();myConn.Open();  
  13. SqlCommandmyComm=newSqlCommand();  
  14. try  
  15. {  
  16. myComm.Connection=myConn;  
  17. myComm.CommandText="DECLARE@TranNameVARCHAR(20)";  
  18. myComm.CommandText+="SELECT@TranName='MyTransaction'";  
  19. myComm.CommandText+="BEGINTRANSACTION@TranName";  
  20. myComm.CommandText+="USEpubs";  
  21. myComm.CommandText+="UPDATEroyschedSETroyalty=royalty*1.10WHEREtitle_idLIKE'Pc%'";  
  22. myComm.CommandText+="COMMITTRANSACTIONMyTransaction";  
  23. myComm.ExecuteNonQuery();  
  24. }  
  25. catch(Exceptionerr)  
  26. {  
  27. thrownewApplicationException("事务操作出错,系统信息:"+err.Message);  
  28. }  
  29. finally  
  30. {  
  31. myConn.Close();  
  32. }  
  33. }  
  34. file://获取数据连接  
  35. privateSqlConnectionGetConn()  
  36. {  
  37. stringstrSql="DataSource=localhost;IntegratedSecurity=SSPI;userid=sa;password=";  
  38. SqlConnectionmyConn=newSqlConnection(strSql);  
  39. returnmyConn;  
  40. }  
  41. }  
  42.  
  43. publicclassTest  
  44. {  
  45. publicstaticvoidMain()  
  46. {  
  47. DbTranSqltranTest=newDbTranSql();  
  48. tranTest.DoTran();  
  49. Console.WriteLine("事务处理已经成功完成。");  
  50. Console.ReadLine();  
  51. }  
  52. }  

注意到其中的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类。

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

【编辑推荐】

  1. 分析C#不安全代码
  2. 浅析C#调用ImageAnimator
  3. C#连接Access、SQL Server数据库
  4. 浅谈C#固定的和活动的变量
  5. 介绍C#中的值类型

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...