1

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

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

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

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

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

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

然后循环项目说

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

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

4

3 回答 3

4

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

// 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();
    }        
}
于 2012-02-03T22:22:09.947 回答
0

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

于 2012-02-03T22:20:39.633 回答
0

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

这里有一篇很好的 MSDN 文章

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

于 2012-02-04T01:13:37.463 回答