Dapper.net 交易问题 [已关闭]

问题描述 投票:0回答:3

我正在尝试向我的 Sql Server 2008 数据库提交一个事务 - 首先是 2 个插入,然后是几个更新,但是,一旦它尝试执行第一个更新,我就会收到以下错误:

ExecuteNonQuery 要求命令在以下情况下有事务: 分配给该命令的连接处于挂起的本地事务中。 命令的 Transaction 属性尚未初始化。

这是代码,为简洁起见稍作编辑:

using (_cn)
{
    _cn.Open();
    IDbTransaction transaction = _cn.BeginTransaction();
    topicId = (int)_cn.Query<decimal>(qAddTopic, new { pForumId = topic.ForumId }, transaction).Single();
    postId = (int)_cn.Query<decimal>(qAddPost, new { pTopicId = topicId }, transaction).Single();

    _cn.Execute(qUpdateForums, new { pLastPostId = postId });
    _cn.Execute((qUpdateSiteTotals));

    transaction.Commit();
}

前 2 个插入工作正常,但一旦它尝试执行其中一个更新,就没有乐趣了。

asp.net sql-server-2008 orm dapper
3个回答
33
投票

我发现了问题 - 当我调用更新时,我只是缺少事务参数,而之前的插入工作正常,我已经包含了

IDbTransaction
参数!我的错!

示例:

Connection.Query<Entitiy>("sqlQuery",param: new { id= ID}, transaction: Transaction)

5
投票

Microsoft 建议尽可能使用

TransactionScope
而不是数据库
IDbTransaction
。假设您的 SQL 没有任何问题并且托管提供程序自动加入环境事务,以下代码应该可以工作 - 这是行为良好的提供程序需要做的事情。

using (var ts = new TransactionScope())
{
  using (_cn)
  {
    _cn.Open();
    ...
  }
  
  ts.complete();
}

0
投票

这就是我的案例中的问题所在。我有这段代码,看起来一切都很好。

public async Task ClearCurrentBasePriceFile(IDbTransaction transaction = null)
{
    var connection = transaction?.Connection ?? _db;

    await connection.ExecuteAsync(@"
        DELETE
        FROM PRICE_LIST_BASE",
        transaction
    ).ConfigureAwait(false);
}

我正在传递交易。我确信该交易不为空。但它仍然会给我错误。

事实证明,如果我在

null
参数前面(
transaction
参数应该在的位置)添加
param
,那么它就可以工作。它似乎将交易参数作为 param 参数,因此它认为我没有提供交易。

© www.soinside.com 2019 - 2024. All rights reserved.