C# 尝试在C代码中使两个SQL INSERT语句原子化

C# 尝试在C代码中使两个SQL INSERT语句原子化,c#,sql,transactions,ssis,atomic,C#,Sql,Transactions,Ssis,Atomic,下面是我在SSIS脚本任务中使用的代码。我试图使这两个插入原子,因为他们与类似的客户处理 executeNonQuery工作正常,按其应该的方式锁定SQL表 第二个.executNonQuery引发错误: ExecuteOnQuery要求命令在 分配给该命令的连接位于挂起的本地事务中。 命令的事务属性尚未初始化 代码: 编辑 通过消除第二个连接,我能够使此事务正常工作。但是,两个查询都使用两个相同的变量SqlParameters。我被迫复制这些,以便运行时不会出错。他们有没有办法共享变量,这样我

下面是我在SSIS脚本任务中使用的代码。我试图使这两个插入原子,因为他们与类似的客户处理

executeNonQuery工作正常,按其应该的方式锁定SQL表

第二个.executNonQuery引发错误:

ExecuteOnQuery要求命令在 分配给该命令的连接位于挂起的本地事务中。 命令的事务属性尚未初始化

代码:

编辑


通过消除第二个连接,我能够使此事务正常工作。但是,两个查询都使用两个相同的变量SqlParameters。我被迫复制这些,以便运行时不会出错。他们有没有办法共享变量,这样我就不必浪费空间重新创建它们了

一个事务不能跨越多个连接。。。cm.AcquireConnection是否每次都返回一个新连接?如果是,请尝试对两个命令使用相同的连接。

使用transactionscope

using(TransactionScope ts = new TransactionScope())
{

        using(SqlConnection conn = new SqlConnection(myconnstring)
        {
            conn.Open();
    //call first executenonquery
    //call second executenonquery
            ts.Complete();
            conn.Close();
        }
}

我认为问题可能出在连接上,或者当您为第二次插入将命令设置为新命令时,您可以使用具有相同连接的两个不同命令,或者仅更改CommandText属性即可重用一个命令


希望这有助于

TransactionScope没有达到最佳性能。。。某些防火墙配置也可能存在问题。其他选项可能更合适。我很好奇,是什么迫使您使用现有SSIS OLE/ADO目标编写自己的插入逻辑?
using(TransactionScope ts = new TransactionScope())
{

        using(SqlConnection conn = new SqlConnection(myconnstring)
        {
            conn.Open();
    //call first executenonquery
    //call second executenonquery
            ts.Complete();
            conn.Close();
        }
}