使用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
相关产品推荐
相关产品推荐

