2009-05-31 9 views
6

Korzystam z zestawów danych ADO.NET w moich aplikacjach VB. Mam wpisany zestaw danych z jedną tabelą nadrzędną i wieloma tabelami podrzędnymi. Chcę wygenerować klucz tożsamości podczas wstawiania danych do tabeli nadrzędnej, a następnie aktualizowania danych we wszystkich tabelach podrzędnych za pomocą tego samego klucza (jako klucz foregin).Jak zaktualizować tabele rodzica i dziecka w zestawie danych z wygenerowanym automatycznie kluczem tożsamości?

Wreszcie, chcę zaktualizować zestaw danych w bazie danych (SQL Server08).

Cóż, powyższa sprawa może być możliwa po uprzednim wstawieniu bezpośrednio tabeli rodziców w bazie danych, uzyskaniu kolumny Tożsamość, a następnie użycia w tabelach podrzędnych.

Ale chcę tego jako pracy automatycznej (jak LINQ to SQL, która dba o Podstawowej & klucz obcy w datacontext.)

ja coś takiego możliwe w zbiorze danych, która dba o kolumnie wygenerowany automatycznie dla rodzicem a dzieckiem stoły?

Dzięki,

ABB

Odpowiedz

4

Myślę, że powinno to być bardziej oczywiste i powinno działać bez żadnych zmian. Ale nadal jest to dość łatwe.

Rozwiązanie ma dwie części:

  1. Tworzenie DataRelation między dzieci i matek stoły i ustawić go na Kaskada na aktualizacje. W ten sposób, gdy identyfikator nadrzędny zmieni się, wszystkie dzieci będą aktualizowane.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId")) 
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade 
    
  2. wkładki zestawu danych i rozkazów uaktualniających jest dwukierunkowe: Jeżeli istnieją parametry wyjściowe związane i wszystkie wiersze danych powrócił one być używane do aktualizacji zestawu danych wiersz spowodowane aktualizacji.

    Jest to najbardziej przydatne dla tego konkretnego problemu: pobieranie automatycznie generowanych kolumn z powrotem do aplikacji. Oprócz tożsamości może to być na przykład kolumna znacznika czasu. Ale tożsamość jest najbardziej przydatna.

    Wszystko, co musimy zrobić, to ustawić polecenie wstawiania, aby zwrócić tożsamość. Istnieje kilka sposobów, aby to zrobić, na przykład:

    a) Korzystanie z procedury przechowywanej z parametrem wyjściowym. Jest to najbardziej przenośny sposób wśród "prawdziwych" baz danych.

    b) Używanie wielu instrukcji SQL, z ostatnim zwracanym wstawionym wierszem. Jest to AFAIK specyficzne dla SQL Server, ale najprostsza:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...); 
    select * from Parent where Id = SCOPE_IDENTITY(); 
    

Po ustawieniu tego do góry, wszystko co musisz zrobić, to utworzyć wiersze rodzic z Id s, które są unikalne (w ramach pojedynczego zbioru danych), ale niemożliwe baza danych. Liczby ujemne są zwykle dobrym wyborem.Następnie, po zapisaniu zmian w zestawie danych w bazie danych, wszystkie nowe wiersze nadrzędne otrzymają prawdziwe Id s z bazy danych.


Uwaga: Jeśli zdarzy ci się pracować z bazą danych bez wielu instrukcji podpór i bez procedur składowanych (np Access), trzeba będzie do konfiguracji obsługi zdarzeń na RowUpdated wydarzenia w adapterze tabeli nadrzędnej. W hanlerze musisz uzyskać tożsamość za pomocą polecenia select @@IDENTITY.


Niektóre linki:

3

kilka rzeczy zwrócić uwagę.

  1. Tak, zdecydowanie potrzebujesz relacji przypisanych do obu tabel. Możesz sprawdzić w edytorze xsd (dwukrotnie kliknij na plik xsd). Domyślnie relacja jest ustawiona jako "tylko relacja", która nie ma żadnej "reguły aktualizacji". Zmodyfikuj tę relację, przechodząc do "relacji edycyjnej" i wybierz "Tylko obcość klucza obcego" lub "Zarówno ~~~". I trzeba ustawić "Update Rule" jako Cascade! "Usuń regułę" należy do Ciebie.

  2. Teraz, gdy używasz nowego identyfikatora wiersza tabeli rodziców (AutoInkrement) dla nowych wierszy tabeli podrzędnej jako klucza obcego, musisz dodać wiersz nadrzędny do tabeli, zanim użyjesz nowego identyfikatora wiersza rodzica.

  3. Po wywołaniu Aktualizuj dla tabeli nadrzędnej za pomocą tableadapter, nowe wiersze tabeli podrzędnej będą miały prawidłowy identyfikator nadrzędny AUTOMATYCZNIE.

Moi proste fragmenty kodu:

'--- Make Parent Row 
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow 
drOrder.SomeValue = "SomeValue" 
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS 

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables.... 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1") 
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2") 
'.... 
'.... 

'--- Update Parent table first 
myTableAdapterTOrder.Update(myDS.TOrder) 
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1) 
'--- will become real number given by SQL server. And also new rows in child table will 
'--- have the updated parentID 

'--- Now update child table 
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail) 

Mam nadzieję, że to pomaga!