2011-07-31 14 views
7

Estoy intentando realizar una transacción en mi base de datos de Sql Server 2008: en primer lugar, dos insertos seguidos por un par de actualizaciones, sin embargo, tan pronto como intenta ejecutar la primera actualización, obtengo el siguiente error:Problema de transacción de Dapper.net

ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.

Aquí está el código, editado ligeramente por razones de brevedad:

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

las 2 primeras inserciones funcionan bien, pero tan pronto como se intenta llevar a cabo una de las actualizaciones, no hay alegría.

Respuesta

11

he encontrado el problema - Yo simplemente estaba perdiendo el parámetro transacción cuando estaba llamando a los cambios, mientras que con los insertos anteriores que estaban trabajando bien, yo había incluido el parámetro IDbTransaction! ¡Mi error!

Ejemplo:

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

'Connection.Query (" sqlQuery ", param: new { id = ID}, transacción: transacción) ' – vaheeds

5

Microsoft recomienda usar TransactionScope sobre la base de datos IDbTransaction cuando sea posible. El siguiente código debería funcionar, suponiendo que nada está mal con su SQL y el proveedor administrado automáticamente se enlista en la transacción ambiental, algo que los proveedores de buen comportamiento deben hacer.

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

    ts.complete(); 
} 
+1

Gracias por la respuesta, Oliver. Desafortunadamente parece que Dapper.net no es compatible con TransactionScope, solo IDbTransaction :( – marcusstarnes

+0

@marcusstarnes ¿está seguro? Se supone que funciona. Simplemente no use BeginTransaction y Commit. TransactionScope manejará el resto – adt

+2

Dapper es absolutamente agnóstico a las transacciones. m usando TransactionScope junto con Dapper sin ningún problema. –

Cuestiones relacionadas