2009-09-17 3 views
9

Je réalise des suppressions en cascade dans un événement envoyé depuis un Gridview. Les suppressions sont dans une transaction. Voici le code simplifié:Error Grinding Gridview: "Le TransactionScope actuel est déjà terminé"

protected void btnDeleteUser_Click(object sender, EventArgs e) 
{ 
    DataContext db; 
    db = new DataContext(); 

    using (TransactionScope ts = new TransactionScope()) 
    { 
     try 
     { 
      //delete some data 
      db.SubmitChanges(); 

      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      // handle error 
     } 
     finally 
     { 
      db.Dispose(); 
      BindGridView(); 
     } 
    } 
} 


private void BindGridView() 
{ 
    DataContext db; 

    db = new DataContext(); 

    GridView.DataSource = <my query> 

    GridView.DataBind();  <========Exception 

    db.Dispose(); 
} 

La méthode appel à DataBind() de la grille échoue avec cette exception: « Le TransactionScope actuel est déjà complet. » Pourquoi?

Bien sûr, le TransactionScope est complet à ce stade, et il devrait le faire. Lorsque je supprime le TransactionScope, cela fonctionne.

Répondre

11

Déplacez BindGridView() en dehors de la portée de la transaction.

using (TransactionScope ts = new TransactionScope()) 
    { 
     try 
     { 
      //delete some data 
      db.SubmitChanges(); 

      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      // handle error 
     } 
     finally 
     { 
      db.Dispose(); 
     } 
    } 
    BindGridView(); 
+0

merci, c'était facile. – cdonner

+1

Merci. Cela a aidé à résoudre un problème auquel je faisais face. Cependant, je ne suis pas sûr pourquoi ce problème se produit. – Phil

+10

@Phil: Le GridView est lié après la validation de la transaction, mais alors qu'il est encore dans le cadre de la transaction. Le message d'erreur dit: "Vous mettez ceci dans la transaction, mais je ne peux pas l'exécuter parce que vous avez déjà validé la transaction." Comme la transaction n'est pas nécessaire pour lier GridView, il est logique de l'isoler de la portée de la transaction. –

Questions connexes