You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用connection.Query添加trans.commit时调用存储过程报错求助

问题解决方法

错误的核心原因是:当连接处于挂起的本地事务中时,所有执行的命令必须关联该事务。你使用Dapper的connection.Query时,没有把开启的事务对象传递给它,导致命令未绑定事务,触发报错。

另外你的代码还有两个逻辑错误:

  • 首次插入后就执行trans.Commit(),后续的Lot插入会脱离事务控制,失去原子性
  • 循环中每次插入Lot后都Commit,违背了事务"要么全成要么全败"的原则

以下是修正后的代码:

public bool insertTransactions(string receiver, string deliverer, string module, DateTime date, bool isChkout, int timeLapse, List<Lot> Lots)
{
    using (var connection = new SqlConnection(ConnString))
    {
        connection.Open();
        var trans = connection.BeginTransaction();

        try
        {
            // 给Dapper的Query方法添加transaction参数,绑定事务
            var data = connection.Query<TransactionsModel>("[sp_insertTransaction2]",
            new
            {
                receiver,
                deliverer,
                module,
                date,
                isChkout,
                timeLapse
            },
            transaction: trans, // 关键:绑定事务
            commandTimeout: 120, 
            commandType: CommandType.StoredProcedure);

            foreach (var lot in Lots)
            {
                // 同样给Lot插入的Query方法绑定事务
                var data2 = connection.Query<TransactionsModel>("[sp_insertLot]",
                 new
                {
                    lot.LotVPO,
                    lot.Bin,
                    lot.Location,
                    lot.Qty,
                },
                 transaction: trans, // 关键:绑定事务
                 commandTimeout: 120, 
                 commandType: CommandType.StoredProcedure);
            }
            
            // 所有操作完成后,统一提交事务
            trans.Commit();
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine("insertTransactions API error : " + ex.ToString());
            trans.Rollback();
            return false;
        }
    }
}

关键修改点说明

  • 每次调用Dapper的Query(或Execute)方法时,添加transaction: trans参数,让命令关联到开启的事务
  • 将trans.Commit()移到所有数据库操作完成之后,确保整个流程在同一个事务内
  • 移除循环内的trans.Commit(),避免提前提交事务导致后续操作脱离事务控制

补充:如果你的存储过程只是执行插入操作不需要返回数据,建议用connection.Execute代替Query,更符合语义,用法和Query一致,同样需要传递transaction参数。

内容的提问来源于stack exchange,提问作者Lia Lucindia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:37:37