Проблема транзакции Dapper.net - PullRequest
11 голосов
/ 31 июля 2011

Я пытаюсь зафиксировать транзакцию в моей базе данных 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 вставки работают нормально, но как только он пытается выполнить одно из обновлений, радости нет.

Ответы [ 3 ]

17 голосов
/ 02 августа 2011

Я обнаружил проблему - я просто пропускал параметр транзакции при вызове обновлений, тогда как с предыдущими вставками, которые работали нормально, я включил параметр IDbTransaction!Мой плохой!

Пример:

Connection.Query<Entitiy>("sqlQuery",param: new { id= ID}, transaction: Transaction)
5 голосов
/ 01 августа 2011

Microsoft рекомендует использовать TransactionScope поверх базы данных IDbTransaction, когда это возможно. Следующий код должен работать, предполагая, что с вашим SQL нет ничего плохого, и управляемый провайдер автоматически подключается к внешней транзакции - то, что должны делать добросовестные провайдеры.

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

  ts.complete();
}
0 голосов
/ 19 января 2019
using (var con = new SqlConnection(connectionString))
                {
                        con.Open();
                        using (IDbTransaction transaction = con.BeginTransaction())
                        {
                            string query = @"ur query";
                            var ID = con.Query<int>(query, new
                            {
                               //params of query
                            }, transaction).Single();
                            transaction.Commit(enter code here);
                            return "Record Saved Successfully.";
                        }
               };
...