Dapper.net交易問題

asp.net dapper orm sql-server-2008

我正在嘗試將事務提交到我的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個插入工作正常,但只要它嘗試執行其中一個更新,就沒有快樂。

一般承認的答案

我發現了問題 - 當我調用更新時,我只是錯過了事務參數,而之前的插入工作正常,我已經包含了IDbTransaction參數!我的錯!

例:

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

熱門答案

Microsoft建議盡可能使用TransactionScope而不是數據庫IDbTransaction。以下代碼應該有效,假設您的SQL沒有任何問題,託管提供程序會自動登記在環境事務中 - 這是行為良好的提供程序需要做的事情。

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

  ts.complete();
}


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因