【问题标题】:Execute multiple stored procedures in one transaction from WCF从 WCF 在一个事务中执行多个存储过程
【发布时间】:2012-02-26 12:16:29
【问题描述】:

这是我在这里的第一篇文章..

我正在用 MVC3 编写一个程序,它有一个充当数据访问层的 WCF 服务。在我的 DAL 中,我必须进行某种“批量”插入和更新。例如,尤其是订单。假设一个订单有多个项目,并且可能有多种付款方式等。所以当我插入一个新订单时,我'将需要插入与该订单相关的所有项目等等..

因此,我正在寻找能够运行多个存储过程的更好方法和可行方法,例如一个将插入订单,另一个将插入其项目等。

OrderItem 表与名为 Order_Items 的第三个表链接在一起,该表将具有 (fk) order_id, (fk) item_id, qty, price..

我知道我可以通过更改命令文本并使用事务执行非查询来运行多个命令.. 但我想运行存储过程而不是硬编码文本命令.. 或者我可以通过制作命令文本来运行这些过程喜欢

cmd.CommandText = 'exec sp_insert_order @order_number @order_date ...'
cmd.ExecuteNonQuery();

然后循环项目说

foreach (string s in insert_items)
{
    cmd.CommandText = s;
    cmd.ExecuteNonQuery();
}

所有这些都在一个事务中然后进行提交.. 但我不觉得这是一种如此干净的做事方式.. 有人可以分享他们的意见吗。

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!

标签: wcf asp.net-mvc-3 stored-procedures data-access-layer batch-insert


【解决方案1】:

您可能还对 WCF 中内置的事务传播功能感兴趣。它可以配置为每次对 WCF 的 Web 服务调用都会自动为您创建、提交或回滚事务,基本上将整个服务方法调用包装在一个事务中。

有一个good MSDN writeup on it here

这是一个有点高级的话题,对于你需要的东西可能有点矫枉过正,但要记住一些事情。

【讨论】:

    【解决方案2】:

    如果你使用存储过程,你应该改变你调用它们的方式——我建议使用这种方法:

    // define your stored procedure name, and the type 
    cmd.CommandText = 'dbo.sp_insert_order';
    cmd.CommandType = CommandType.StoredProcedure;
    
    // define and fill your parameters
    cmd.Parameters.Add("@order_number", SqlDbType.Int).Value = order_nr;
    cmd.Parameters.Add("@order_date", SqlDbType.DateTime).Value = ......;
    
    cmd.ExecuteNonQuery();
    

    基本上,您必须为要调用的每个存储过程执行此操作,并且您可以将所有这些都包装在一个事务中而不会出现任何问题:

    using(SqlConnection connection = new SqlConnection("your-connection-string-here"))
    {
       SqlTransaction transaction = connection.BeginTransaction();
    
       try
       {
            // call all stored procuedures here - remember to assign the 
            // transaction to the SqlCommand!!
             ....
    
            transaction.Commit();
        }
        catch(Exception exc) 
        {
           transaction.Rollback();
        }        
    }
    

    【讨论】:

    • 感谢您的回复.. 这实际上是我目前使用的方法.. 我正在发送要执行的命令列表,但是当我遍历要执行的命令时,在首先 ExecuteNonQuery() 它直接进入提交并且没有继续循环。我更改了一些代码并为循环中的每个命令创建了一个新实例并使其正常工作。我很困惑,因为它在执行第一个查询后退出了循环,所以我认为这种方式由于某种原因不起作用..但它确实..再次感谢,干杯;)
    【解决方案3】:

    您可以在方法上使用 TransactionScope 属性将所有工作包含在事务过程或文本中

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2010-09-15
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多