【问题标题】:calling the same ADO.NET Command several times within the scope of a single transaction在单个事务的范围内多次调用相同的 ADO.NET 命令
【发布时间】:2016-11-14 20:34:27
【问题描述】:

我的问题涉及如何在一个订单上插入多个订单项,例如,在单个交易的范围内。

必须插入所有行项目,否则必须回滚事务。

是否可以在不发送自定义 CLR 对象作为参数(相当于表值参数)的情况下对同一个表进行多次插入?是否可以在循环内调用 MyInsertSingleLineItemCommand,每次调用时插入一个行项目?我们需要一个中间临时表吗?

【问题讨论】:

  • 当然。 dotnet 中有一个 SqlTransaction 类,您可以使用它来开始/提交/回滚。 msdn.microsoft.com/en-us/library/…
  • 是的,这是可能的,但在这种情况下,表值参数会更有效。

标签: sql-server transactions ado.net


【解决方案1】:

可以在不发送a的情况下对同一个表进行多次插入吗 自定义 CLR 对象作为参数,相当于一个表值 参数?

是的,您可以使用 SqlTransaction 在单个事务中逐行执行。

可以在循环内调用 MyInsertSingleLineItemCommand,插入 每次调用一个订单项?

是下面的示例代码。

using (SqlConnection cn = new SqlConnection("YOUR CONNECTION STRING")
{
     cn.Open();
     using (SqlTransaction tr = cn.BeginTransaction()) 
     {
          // your looping code here persisting to sql server db
          tr.Commit();
     }
}

您也可以使用TransactionScope 完成此操作。

using (var ts = new TransactionScope())
{
   using (SqlConnection connection = new SqlConnection("YOUR CONNECTION STRING"))
   {
      connection.Open();
      // your looping code here persisting to sql server db
   }

   ts.Complete();
}

我们需要一个中间临时表吗?

不,您不需要临时表。

话虽如此,您可能需要考虑使用SqlBulkCopyTable Value Parameter 将数据传递给Sql Server。虽然这取决于您的要求。

More info here on TVPs.

【讨论】:

    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2014-08-20
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多