2009-09-17 13 views
9

Robię kaskadowe usuwanie w zdarzeniu wysyłanym z Gridview. Usunięte są w transakcji. Oto uproszczony kod:Błąd wiązania Gridview: "Bieżący TransactionScope jest już gotowy"

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

Wezwanie do sieci za DataBind() metoda nie powiedzie się z tego wyjątku: „Obecny TransactionScope jest już kompletna” Dlaczego?

Oczywiście w tym momencie TransactionScope jest kompletny i powinien. Po usunięciu TransactionScope działa.

Odpowiedz

11

Przenieś BindGridView() poza zasięg transakcji.

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

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

dziękuję, to było łatwe. – cdonner

+1

Dzięki. Pomogło to rozwiązać problem, z którym miałem do czynienia. Jednak nie jestem pewien DLACZEGO te problemy występują. – Phil

+10

@Phil: GridView jest wiązany po zatwierdzeniu transakcji, ale nadal znajduje się w zakresie transakcji. Komunikat o błędzie mówi: "Umieściłeś to w transakcji, ale nie mogę jej wykonać, ponieważ już dokonałeś transakcji." Ponieważ transakcja nie jest wymagana do wiązania GridView, sensowne jest odizolowanie go od zakresu transakcji. –

Powiązane problemy