Problème de transaction Dapper.net

asp.net dapper orm sql-server-2008

Question

J'essaie de valider une transaction sur ma base de données SQL Server 2008 - tout d'abord 2 insertions suivies de quelques mises à jour, cependant, dès qu'il tente d'exécuter la première des mises à jour, j'obtiens l'erreur suivante:

ExecuteNonQuery nécessite que la commande ait une transaction lorsque la connexion affectée à la commande est dans une transaction locale en attente. La propriété Transaction de la commande n'a pas été initialisée.

Voici le code, légèrement modifié pour plus de brièveté:

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();
}

Les 2 premières insertions fonctionnent bien, mais dès qu’elles tentent d’effectuer l’une des mises à jour, pas de joie.

Réponse acceptée

J'ai trouvé le problème - je IDbTransaction le IDbTransaction transaction lorsque j'appelais les mises à jour, alors qu'avec les insertions précédentes qui fonctionnaient IDbTransaction , j'avais inclus le IDbTransaction ! Ma faute!

Exemple:

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

Réponse populaire

Microsoft recommande d'utiliser TransactionScope sur la base de données IDbTransaction lorsque cela est possible. Le code suivant devrait fonctionner, en supposant que rien ne s’applique à votre SQL et que le fournisseur géré s’inscrit automatiquement dans la transaction ambiante, ce que les fournisseurs bien élevés doivent faire.

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

  ts.complete();
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi