zoukankan      html  css  js  c++  java
  • 在Asp.Net中的几种事务处理的方法

    //======================================================================
    //方法1:直接写入到Sql脚本中
    //优点:和数据库结合,运行效率高
    //缺点:受到数据库的约束,如果要从sqlserver移植到其他数据库,可能要重写所有事物
    //======================================================================
    begin trans//开始事务
    declare @orderDetailsError int , @productError ing
    delete from "order details" where productId = 42
    select @orderDetailsError = @@ERROR
    delete from Products where productId = 42
    select @productError = 0 and @productError = 0
    commit trans//提交事务
    else
    rollback trans//回滚事务


    //======================================================================
    //方法2:使用Ado.net实现
    //优点:不受数据库限制,
    //缺点:对于一个事物要操作两个以上的数据库的跨数据库的操作的实现有一点困难。
    //======================================================================
    public void Exec_Jiaoyi( int  customerId,string  customer,int  lastNum,int  receiptId,string  seller,string  principal,DateTime  bargainTime , decimal addMoney , string memo )
    {
    SqlConnection myConn = new SqlConnection( System.Configuration.ConfigurationSettings.AppSettings["connectionString"] ) ;
    myConn.Open ( ) ;
    SqlTransaction myTrans = myConn.BeginTransaction ( ) ;
    SqlCommand myCommand=new SqlCommand ( );
    myCommand.Connection = myConn ;
    myCommand.Transaction = myTrans ;//开始事务
    try
    {
    myCommand.Parameters.Add(new SqlParameter("@m_customerId", SqlDbType.Int,0)).Value=customerId;
    myCommand.Parameters.Add(new SqlParameter("@m_customer", SqlDbType.NVarChar,100)).Value=customer;
    myCommand.Parameters.Add(new SqlParameter("@m_lastNum", SqlDbType.Int,0)).Value=lastNum;
    myCommand.Parameters.Add(new SqlParameter("@m_receiptId", SqlDbType.Int,0)).Value=receiptId;
    myCommand.Parameters.Add(new SqlParameter("@m_seller", SqlDbType.NVarChar,100)).Value=seller;
    myCommand.Parameters.Add(new SqlParameter("@m_principal", SqlDbType.NVarChar,100)).Value=principal;
    myCommand.Parameters.Add(new SqlParameter("@m_bargainTime", SqlDbType.DateTime,0)).Value=bargainTime;
    myCommand.Parameters.Add(new SqlParameter("@m_addMoney", SqlDbType.Decimal,9)).Value=addMoney;
    myCommand.Parameters.Add(new SqlParameter("@m_memo", SqlDbType.NVarChar,100)).Value=memo;
    SqlParameter returnParam = myCommand.Parameters.Add(new SqlParameter("@thisId",SqlDbType.Int));
    returnParam.Direction    = ParameterDirection.Output;

    //SELECT @thisId=SCOPE_IDENTITY() FROM caiwzhk
    //SqlParameter returnParam = myCommand.Parameters.Add(new SqlParameter("@thisId",SqlDbType.Int));
    //returnParam.Direction    = ParameterDirection.Output;
    //returnId = (int)myCommand.Parameters["@thisId"].Value;
    myCommand.CommandText = "insert into jiaoyxx_pack ( customerId,customer,lastNum,receiptId,seller,principal,bargainTime) values (@m_customerId,@m_customer,@m_lastNum,@m_receiptId,@m_seller,@m_principal,@m_bargainTime) SELECT @thisId=SCOPE_IDENTITY() FROM jiaoyxx_pack" ;
    myCommand.ExecuteNonQuery ( ) ;

    int returnId = (int)myCommand.Parameters["@thisId"].Value;
    myCommand.CommandText = "insert into chongzhgl_pack ( bargainId,customerId,customer,addMoney,addTime,principal,memo) values ( " + returnId.ToString() + " ,@m_customerId,@m_customer,@m_addMoney,@m_bargainTime,@m_principal,@m_memo)" ;
    myCommand.ExecuteNonQuery ( ) ;

    myTrans.Commit ( ) ;//提交事务
    }
    catch ( Exception e )
    {
    myTrans.Rollback ( ) ;//回滚事务
    throw new Exception ( e.ToString ( ) ) ;
    }
    finally
    {
    myCommand.Dispose();
    myConn.Close ( ) ;
    myConn.Dispose();
    }

    //======================================================================
    //方法3:使用COM+事务
    //优点:强大的事物处理机制,不但支持跨数据库,还支持负载平横等。
    //缺点:运行效率不如上面两种,部署的时候优点麻烦
    //======================================================================
    using System.EnterpriseServices;
    using System.Runtime.CompilerServices;
    using System.Reflection;

    // Supply the COM+ application name.
    [assembly: ApplicationName("ComPlusExample")]//这个COM+应用程序的名称
    // Supply a strong-named assembly.
    [assembly: AssemblyKeyFileAttribute("ComPlusExample.snk")]//一定要strong-named文件

    namespace cl
    {
    [Transaction(TransactionOption.Required)]//表示类是要支持事务的
    public class ComPlusExample : ServicedComponent
    {
    [AutoComplete] //表示自动提交,hello()函数没有异常就commit,有异常就rollback
    public string hello()
    {
    return "com+成功!!!"; 
    }
    }
    }


    //======================================================================
    //备注
    //======================================================================
    1.创建强名称
       在编译组件之前,您需要为此组件的程序集指定一个强名称。如果不指定,COM+ 目录将不能识别该组件,也就无法注册它。实际上,您已经通过前面使用的 AssemblyKeyFile 属性指定了强名称,现在需要使用强名称工具 (Sn.exe) 创建强名称并使 GUID 与程序集关联。
    打开命令提示。
    要创建强名称,请在命令提示下键入以下代码,然后按 Enter 键。
    sn -k ComPlusExample.snk
    将 ComPlusExample.snk 文件从硬盘驱动器的根目录(通常为 C:/)复制到项目所在文件夹的 bin 目录下。
      现在,需要编译此程序,使它能生成在 COM+ 注册此组件必需的文件。在 Visual Studio .NET 中,在 Build(生成)菜单上,单击 Build(生成)。
  • 相关阅读:
    ansible使用
    git undo last commit
    metadata简介
    tinyint(4),tinyint(80)有什么区别
    php 打印debug日志
    tinycore Network card configuration during exec bootlocal.sh
    Windows使用CMD命令查看进程和终止进程
    @NotEmpty,@NotNull和@NotBlank的区别
    spring boot 程序启动缓慢的问题(二)
    LocalDateTime的一些用法
  • 原文地址:https://www.cnblogs.com/longyi/p/1498375.html
Copyright © 2011-2022 走看看