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