2009-09-17 5 views
9

Ich mache kaskadierende Löschungen in einem Ereignis von Gridview gesendet. Die Löschungen befinden sich in einer Transaktion. Hier ist der vereinfachte Code:Fehler Binding Gridview: "Das aktuelle TransactionScope ist bereits abgeschlossen"

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

Der Aufruf an das Netz der DataBind() -Methode nicht mit dieser Ausnahme: „Die aktuelle Transaction ist bereits abgeschlossen“ Warum?

Natürlich ist das TransactionScope zu diesem Zeitpunkt abgeschlossen, und es sollte. Wenn ich das TransactionScope entferne, funktioniert es.

Antwort

11

Verschieben Sie BindGridView() außerhalb des Transaktionsbereichs.

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

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

danke, das war einfach. – cdonner

+1

Danke. Dies half mir, ein Problem zu lösen. Ich bin mir jedoch nicht sicher, warum dieses Problem auftritt. – Phil

+10

@Phil: Das GridView wird gebunden, nachdem die Transaktion festgeschrieben ist, aber während es noch im Bereich der Transaktion ist. Die Fehlermeldung besagt: "Sie haben dies in die Transaktion eingegeben, aber ich kann sie nicht ausführen, da Sie die Transaktion bereits ausgeführt haben." Da die Transaktion nicht benötigt wird, um GridView zu binden, ist es sinnvoll, sie nur aus dem Transaktionsbereich zu isolieren. –

Verwandte Themen