21

我正在尝试向我的 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 个插入工作正常,但一旦它尝试执行其中一个更新,就没有乐趣了。

4

2 回答 2

32

我发现了问题 - 我只是在调用更新时丢失了事务参数,而之前的插入工作正常,我已经包含了IDbTransaction参数!我的错!

例子:

Connection.Query<Entitiy>("sqlQuery",param: new { id= ID}, transaction: Transaction)
于 2011-08-01T20:16:00.907 回答
5

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

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

  ts.complete();
}
于 2011-07-31T20:12:58.293 回答