21

Sql Server 2008 データベースにトランザクションをコミットしようとしています。最初に 2 つの挿入に続いて 2 つの更新が行われますが、最初の更新を実行しようとするとすぐに、次のエラーが発生します。

ExecuteNonQuery では、コマンドに割り当てられた接続が保留中のローカル トランザクションにある場合、コマンドにトランザクションが必要です。コマンドのトランザクション プロパティが初期化されていません。

簡潔にするために少し編集したコードを次に示します。

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 つを実行しようとするとすぐに喜びがありません。

4

2 に答える 2

32

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

例:

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

可能であれば、データベース IDbTransaction よりも TransactionScope を使用することをお勧めします。次のコードは、SQL に問題がなく、マネージ プロバイダーがアンビエント トランザクションに自動的に参加することを前提として動作するはずです。

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

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