Dapper.netの取引問題

asp.net dapper orm sql-server-2008

質問

私は自分のSQL Server 2008データベースにトランザクションをコミットしようとしています - 最初に2つのinsertの後にいくつかのupdateがありますが、最初のupdateを実行しようとすると次のエラーが出ます:

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つのインサートは正常に動作しますが、アップデートの1つを実行しようとするとすぐには喜びはありません。

受け入れられた回答

私は問題を発見しました - 私は更新を呼び出すときにトランザクションのパラメータを単に失っていましたが、以前の正常な挿入ではIDbTransactionパラメータが含まれていました!私の悪い!

例:

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

人気のある回答

可能であれば、データベースIDbTransactionに対してTransactionScopeを使用することをお勧めします。 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は合法ですか? はい、理由を学ぶ