2010-12-20 16 views
5

Posiadać typowy zestaw danych z wieloma powiązanymi tabelami i relacjami zdefiniowanymi między tymi tabelami. Podczas przetwarzania danych, dodawam, modyfikuję i usuwam rekordy, a następnie wywołuję aktualizację w każdej tabeli.Transakcje w typowych zestawach danych

Requests  Reapprovals  UserRole 
RequestId ----- RequestId ----- RoleId 
Reason   RoleId ----/  UserId 

Powodem użyciu wpisywanych zestawu danych jest to, że muszę sprawdzić istniejące dane w celu ustalenia, czy Dodaję, modyfikowania lub usuwania rekordów ... więc muszę pełny zrzut wszystkim pracuję z (alternatywą byłoby 10 000 zapytań w bazie danych, ponieważ przetwarzam rekordy jeden po drugim).

Chcę obsługi transakcyjnej, ale nie widzę sposobu, aby to zrobić z wpisanymi zestawami danych. Na przykład, tworzę nową prośbę, gdy tworzę nowe ponowne zatwierdzenie. Ale jeśli ponowne zatwierdzenie nie powiedzie się, nie chcę zachować żądania.

Umieszczenie wywołań aktualizacji pod numerem TransactionScope oznaczałoby, że jeśli jakiś rekord się nie powiedzie, wszystkie zawiodą. Nie tego chcę.

Jak mogę zatwierdzić lub wycofać powiązane wiersze we wpisanym zestawie danych?

+0

To może Cię zainteresować wiedzieć, że nazywając Aktualizacja na stole ma rzeczywiście wysyłać zapytania do bazy N, jeden dla każdego rekordu, który aktualizujesz/dodawania/usuwanie. Nie zyskujesz więc wiele korzyści przez wywoływanie aktualizacji na stole lub wywoływanie aktualizacji za każdym razem, gdy zmieniasz pojedynczy wiersz. (Mogą wystąpić pewne korzyści przy korzystaniu z opcji wysyłania zbiorczego, ale nie wiem, jak duży) Więc chociaż rzeczywiście możesz użyć swojego pełnego zrzutu pamięci do określenia, które rekordy do modyfikacji, proponuję zawrzeć każdą serię działań dla rekordu we własnym zakresie transakcji. – Pandincus

+0

Zauważyłem, że wiersze aktualizują się jeden po drugim, i rozważałem aktualizowanie wierszy pojedynczo podczas ich modyfikowania ... rzeczą, która nękała mnie, było to, że nazwałem Update() na stole, który sprawdza każdy wiersz, aby sprawdzić, czy potrzebuje aktualizacji. Oznacza to, że powtarzam 10 000 wierszy ponad 10 000 razy, aby znaleźć jeden wiersz, który został zaktualizowany. Nie byłeś pewien, czy ten wynik wydajności byłby ogromny czy nieistotny. –

+0

Pandincus> Jeśli chcesz wprowadzić to, co mówisz, jako odpowiedź, zaakceptuję to. Wygląda na to, że albo wybiorę działanie, robiąc to, co sugerujesz, albo zaakceptuj/odrzucisz zmiany w zestawie danych jako całość: (Dzięki! –

Odpowiedz

3

Możesz użyć zwykłych transakcji, a także uzyskać funkcję transakcji podobną do TableAdapterManager, tak jak w poniższych przykładach.

Pierwsze podejście do wykorzystania regularnych transakcji

public void savewithTransacition() 
    { 
     DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter(); 
     DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter(); 
     SqlTransaction st = null; 
     SqlConnection sc = new SqlConnection("ur conneciton string"); 
     try 
     { 
      sc.Open(); 
      st = sc.BeginTransaction(); 

      taTbl1.Transaction = st; 
      taTbl2.Transaction = st; 
      st.Commit(); 
     } 
     catch (System.Exception ex) 
     { 
      st.Rollback(); 
      throw ex; 
     } 


    } 

Second..with menedżer adapter stół ..

public void SaveWithManager() 
    { 
     DataSet1TableAdapters.TableAdapterManager mgr1 = new DataSet1TableAdapters.TableAdapterManager(); 
     DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter(); 
     DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter(); 

     mgr1.Table1TableAdapter = taTbl1; 
     mgr1.Table2TableAdapter = taTbl2; 
     mgr1.UpdateOrder = DataSet1TableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete; 
     mgr1.UpdateAll(this); 
    } 

Dzięki tej opcji można tworzyć TAManagers dla grupy tabel, aby zapisać. na przykład jeśli chcesz, aby jedna grupa uratowała, a nawet jeśli inna się nie powiedzie.

+0

Przeszukuję informacje o menedżerze transakcji, ale to zupełnie nowy poziom dla transakcji, które Nie jestem zaznajomiony z. Czy masz jakieś przykłady kodu, co masz na myśli, lub linki do zasobów? Dzięki! –

+0

Zmodyfikowany za pomocą przykładowego kodu, możesz wybrać każdego, który jest odpowiedni dla Ciebie. – paragy

+0

Patrząc na to, zaktualizuje się wkrótce Dziękuję! –

0

Można użyć zakres transakcji z różnymi opcjami zakresu

+0

Problem polega na oddzieleniu poszczególnych aktualizacji od głównej funkcji .Update(), aby niektóre mogły się powieść, podczas gdy niektóre się nie powiedzie. –

+0

Możesz użyć kodu S opcja uppress, nieprawdaż? w ten sposób kod znajdujący się w zasięgu transakcji z opcją Suppress nie będzie brać udziału w transakcji nadrzędnej ... – pdiddy

+0

Nie sądzę, że rozumiesz, co próbuję zrobić –