Zapisywanie danych z powrotem do bazy danych w aplikacjach .NET Framework

Uwaga

Zestawy danych i powiązane klasy to starsze technologie .NET Framework z początku 2000 roku, które umożliwiają aplikacjom pracę z danymi w pamięci, gdy aplikacje są odłączone od bazy danych. Są one szczególnie przydatne w przypadku aplikacji, które umożliwiają użytkownikom modyfikowanie danych i utrwalanie zmian z powrotem w bazie danych. Mimo że zestawy danych okazały się bardzo udaną technologią, zalecamy, aby nowe aplikacje platformy .NET używały platformy Entity Framework Core. Program Entity Framework zapewnia bardziej naturalny sposób pracy z danymi tabelarycznymi jako modelami obiektów i ma prostszy interfejs programowania.

Zestaw danych jest kopią danych w pamięci. Jeśli zmodyfikujesz te dane, dobrym rozwiązaniem jest zapisanie tych zmian z powrotem w bazie danych. Można to zrobić na jeden z trzech sposobów:

  • Wywołując jedną z Update metod klasy TableAdapter

  • Wywołując jedną z DBDirect metod klasy TableAdapter

  • Wywołując metodę UpdateAll w tableAdapterManager generowanym przez program Visual Studio, gdy zestaw danych zawiera tabele powiązane z innymi tabelami w zestawie danych

Gdy tabele zestawu danych są powiązane z kontrolkami na stronie Formularz systemu Windows lub XAML, architektura powiązania danych wykonuje całą pracę.

Jeśli znasz elementy TableAdapters, możesz przejść bezpośrednio do jednego z następujących tematów:

Temat opis
Wstawianie nowych rekordów do bazy danych Jak wykonywać aktualizacje i wstawiać przy użyciu obiektów TableAdapters lub Command
Aktualizowanie danych za pomocą adaptera TableAdapter Jak wykonywać aktualizacje za pomocą elementów TableAdapters
Aktualizacja hierarchiczna Jak wykonywać aktualizacje z zestawu danych z co najmniej dwiema powiązanymi tabelami
Obsługiwanie wyjątku współbieżności Jak obsługiwać wyjątki, gdy dwóch użytkowników próbuje zmienić te same dane w bazie danych w tym samym czasie
Instrukcje: zapisywanie danych przy użyciu transakcji Jak zapisywać dane w transakcji przy użyciu systemu. Przestrzeń nazw transakcji i obiekt TransactionScope
Zapisywanie danych w transakcji Przewodnik, który tworzy aplikację Windows Forms w celu zademonstrowania zapisywania danych w bazie danych wewnątrz transakcji
Zapisywanie danych w bazie danych (wiele tabel) Jak edytować rekordy i zapisywać zmiany w wielu tabelach z powrotem do bazy danych
Zapisywanie danych z obiektu w bazie danych Jak przekazywać dane z obiektu, który nie znajduje się w zestawie danych do bazy danych przy użyciu metody TableAdapter DbDirect
Zapisywanie danych za pomocą metod DBDirect adaptera TableAdapter Jak używać obiektu TableAdapter do wysyłania zapytań SQL bezpośrednio do bazy danych
Zapisywanie zestawu danych jako kodu XML Jak zapisać zestaw danych w dokumencie XML

Aktualizacje dwuetapowe

Aktualizowanie źródła danych jest procesem dwuetapowym. Pierwszym krokiem jest zaktualizowanie zestawu danych przy użyciu nowych rekordów, zmienionych rekordów lub usuniętych rekordów. Jeśli aplikacja nigdy nie wysyła tych zmian z powrotem do źródła danych, zakończysz pracę z aktualizacją.

Jeśli wyślesz zmiany z powrotem do bazy danych, wymagany jest drugi krok. Jeśli nie używasz kontrolek powiązanych z danymi, musisz ręcznie wywołać Update metodę tej samej karty TableAdapter (lub karty danych), która była używana do wypełniania zestawu danych. Można jednak również użyć różnych kart sieciowych, na przykład, aby przenieść dane z jednego źródła danych do innego lub zaktualizować wiele źródeł danych. Jeśli nie używasz powiązania danych i zapisujesz zmiany dla powiązanych tabel, musisz ręcznie utworzyć wystąpienie zmiennej klasy wygenerowanej TableAdapterManager automatycznie, a następnie wywołać jej UpdateAll metodę.

Diagram koncepcyjny aktualizacji zestawu danych

Zestaw danych zawiera kolekcje tabel, które zawierają kolekcje wierszy. Jeśli zamierzasz później zaktualizować bazowe źródło danych, należy użyć metod we DataTable.DataRowCollection właściwości podczas dodawania lub usuwania wierszy. Te metody wykonują śledzenie zmian potrzebne do aktualizowania źródła danych. Jeśli wywołasz RemoveAt kolekcję we właściwości Rows, usunięcie nie zostanie przekazane z powrotem do bazy danych.

Scalanie zestawów danych

Zawartość zestawu danych można zaktualizować, scalając go z innym zestawem danych. Obejmuje to skopiowanie zawartości źródłowego zestawu danych do wywołującego zestawu danych (nazywanego docelowym zestawem danych). Podczas scalania zestawów danych nowe rekordy w źródłowym zestawie danych są dodawane do docelowego zestawu danych. Ponadto dodatkowe kolumny w źródłowym zestawie danych są dodawane do docelowego zestawu danych. Scalanie zestawów danych jest przydatne, gdy masz lokalny zestaw danych i otrzymujesz drugi zestaw danych z innej aplikacji. Jest to również przydatne w przypadku uzyskania drugiego zestawu danych z składnika, takiego jak usługa internetowa XML, lub gdy trzeba zintegrować dane z wielu zestawów danych.

Podczas scalania zestawów danych można przekazać argument logiczny (preserveChanges), który informuje Merge metodę, czy zachować istniejące modyfikacje w docelowym zestawie danych. Ponieważ zestawy danych obsługują wiele wersji rekordów, należy pamiętać, że scala się więcej niż jedną wersję rekordów. W poniższej tabeli przedstawiono sposób scalania rekordu w dwóch zestawach danych:

Datarowversion Docelowy zestaw danych Zestaw danych źródłowych
Oryginalne James Wilson James C. Wilson
Bieżąca Jim Wilson James C. Wilson

Merge Wywołanie metody w poprzedniej tabeli z preserveChanges=false targetDataset.Merge(sourceDataset) wynikami następujących danych:

Datarowversion Docelowy zestaw danych Zestaw danych źródłowych
Oryginalne James C. Wilson James C. Wilson
Bieżąca James C. Wilson James C. Wilson

Merge Wywołanie metody z wynikami preserveChanges = true targetDataset.Merge(sourceDataset, true) w następujących danych:

Datarowversion Docelowy zestaw danych Zestaw danych źródłowych
Oryginalne James C. Wilson James C. Wilson
Bieżąca Jim Wilson James C. Wilson

Uwaga

W scenariuszupreserveChanges = true, jeśli RejectChanges metoda jest wywoływana na rekord w docelowym zestawie danych, przywraca oryginalne dane z źródłowego zestawu danych. Oznacza to, że jeśli spróbujesz zaktualizować oryginalne źródło danych przy użyciu docelowego zestawu danych, może nie być w stanie odnaleźć oryginalnego wiersza do zaktualizowania. Naruszenie współbieżności można zapobiec, wypełniając inny zestaw danych zaktualizowanymi rekordami ze źródła danych, a następnie wykonując scalanie, aby zapobiec naruszeniu współbieżności. (Naruszenie współbieżności występuje, gdy inny użytkownik modyfikuje rekord w źródle danych po wypełnieniu zestawu danych).

Aktualizowanie ograniczeń

Aby wprowadzić zmiany w istniejącym wierszu danych, dodaj lub zaktualizuj dane w poszczególnych kolumnach. Jeśli zestaw danych zawiera ograniczenia (takie jak klucze obce lub ograniczenia niepuste), możliwe jest, że rekord może być tymczasowo w stanie błędu podczas jego aktualizowania. Oznacza to, że może być w stanie błędu po zakończeniu aktualizowania jednej kolumny, ale przed przejściem do następnego.

Aby zapobiec przedwczesnym naruszeniom ograniczeń, można tymczasowo zawiesić ograniczenia aktualizacji. Służy to dwóm celom:

  • Zapobiega to zgłaszaniu błędu po zakończeniu aktualizowania jednej kolumny, ale nie rozpoczęto aktualizowania innej kolumny.

  • Zapobiega to wywoływaniu niektórych zdarzeń aktualizacji (zdarzeń, które są często używane do walidacji).

Uwaga

W formularzach Systemu Windows architektura powiązania danych wbudowana w usługę datagrid zawiesza sprawdzanie ograniczeń, dopóki fokus nie zostanie przeniesiony z wiersza i nie trzeba jawnie wywoływać BeginEditmetod , EndEditlub CancelEdit .

Ograniczenia są automatycznie wyłączone, gdy Merge metoda jest wywoływana w zestawie danych. Po zakończeniu scalania, jeśli istnieją jakiekolwiek ograniczenia dotyczące zestawu danych, których nie można włączyć, zgłaszana jest wartość .ConstraintException W takiej sytuacji EnforceConstraints właściwość jest ustawiona na false, , a wszystkie naruszenia ograniczeń muszą zostać rozwiązane przed zresetowaniem EnforceConstraints właściwości do true.

Po zakończeniu aktualizacji można ponownie przeprowadzić sprawdzanie ograniczeń, co umożliwia również ponowne aktualizowanie zdarzeń i wywoływanie ich.

Aby uzyskać więcej informacji na temat zawieszania zdarzeń, zobacz Wyłączanie ograniczeń podczas wypełniania zestawu danych.

Błędy aktualizacji zestawu danych

Podczas aktualizowania rekordu w zestawie danych istnieje możliwość wystąpienia błędu. Na przykład możesz przypadkowo zapisywać dane nieprawidłowego typu w kolumnie lub dane, które są zbyt długie, albo dane, które mają inny problem z integralnością. Może też istnieć kontrola poprawności specyficzna dla aplikacji, która może zgłaszać błędy niestandardowe na dowolnym etapie zdarzenia aktualizacji. Aby uzyskać więcej informacji, zobacz Weryfikowanie danych w zestawach danych.

Utrzymywanie informacji o zmianach

Informacje o zmianach w zestawie danych są przechowywane na dwa sposoby: przez flagowanie wierszy, które wskazują, że zostały zmienione (RowState) i przez przechowywanie wielu kopii rekordu (DataRowVersion). Korzystając z tych informacji, procesy mogą określić, co zmieniło się w zestawie danych i wysyłać odpowiednie aktualizacje do źródła danych.

Właściwość RowState

Właściwość RowStateDataRow obiektu jest wartością, która zawiera informacje o stanie określonego wiersza danych.

W poniższej tabeli przedstawiono możliwe wartości DataRowState wyliczenia:

Wartość DataRowState opis
Added Wiersz został dodany jako element do elementu DataRowCollection. (Wiersz w tym stanie nie ma odpowiedniej oryginalnej wersji, ponieważ nie istniał, gdy wywołano ostatnią AcceptChanges metodę).
Deleted Wiersz został usunięty przy użyciu DeleteDataRow obiektu .
Detached Wiersz został utworzony, ale nie jest częścią żadnego DataRowCollectionelementu . DataRow Obiekt jest w tym stanie natychmiast po jego utworzeniu, przed dodaniu go do kolekcji i po jego usunięciu z kolekcji.
Modified Wartość kolumny w wierszu zmieniła się w jakiś sposób.
Unchanged Wiersz nie zmienił się od AcceptChanges czasu ostatniego wywołania.

DataRowVersion, wyliczenie

Zestawy danych obsługują wiele wersji rekordów. Pola DataRowVersion są używane podczas pobierania wartości znalezionej Item[] we DataRow właściwości lub GetChildRows metodzie DataRow obiektu.

W poniższej tabeli przedstawiono możliwe wartości DataRowVersion wyliczenia:

Wartość DataRowVersion opis
Current Bieżąca wersja rekordu zawiera wszystkie modyfikacje, które zostały wykonane w rekordzie od czasu ostatniego AcceptChanges wywołania. Jeśli wiersz został usunięty, nie ma bieżącej wersji.
Default Wartość domyślna rekordu zdefiniowana przez schemat zestawu danych lub źródło danych.
Original Oryginalna wersja rekordu to kopia rekordu, ponieważ ostatni raz zmiany zostały zatwierdzone w zestawie danych. W praktyce jest to zazwyczaj wersja rekordu odczytywana ze źródła danych.
Proposed Proponowana wersja rekordu, który jest dostępny tymczasowo w trakcie aktualizacji — czyli między czasem wywołania BeginEdit metody i EndEdit metody. Zazwyczaj uzyskujesz dostęp do proponowanej wersji rekordu w programie obsługi dla zdarzenia takiego jak RowChanging. Wywołanie CancelEdit metody odwraca zmiany i usuwa proponowaną wersję wiersza danych.

Oryginalne i bieżące wersje są przydatne podczas przesyłania informacji o aktualizacji do źródła danych. Zazwyczaj po wysłaniu aktualizacji do źródła danych nowe informacje dotyczące bazy danych są w bieżącej wersji rekordu. Informacje z oryginalnej wersji służą do lokalizowania rekordu do aktualizacji.

Na przykład w przypadku zmiany klucza podstawowego rekordu potrzebny jest sposób zlokalizowania poprawnego rekordu w źródle danych w celu zaktualizowania zmian. Jeśli nie istniała oryginalna wersja, rekord najprawdopodobniej zostanie dołączony do źródła danych, co spowoduje nie tylko dodatkowe niechciane rekordy, ale w jednym rekordzie, który jest niedokładny i nieaktualny. Dwie wersje są również używane w kontrolce współbieżności. Możesz porównać oryginalną wersję z rekordem w źródle danych, aby określić, czy rekord uległ zmianie od czasu załadowania go do zestawu danych.

Proponowana wersja jest przydatna, gdy trzeba przeprowadzić walidację przed rzeczywistym zatwierdzeniem zmian w zestawie danych.

Nawet jeśli rekordy uległy zmianie, nie zawsze istnieją oryginalne lub bieżące wersje tego wiersza. Po wstawieniu nowego wiersza do tabeli nie ma oryginalnej wersji, tylko bieżącej wersji. Podobnie, jeśli usuniesz wiersz, wywołując metodę tabeli Delete , istnieje oryginalna wersja, ale nie ma bieżącej wersji.

Możesz sprawdzić, czy istnieje określona wersja rekordu, wykonując zapytanie dotyczące metody wiersza HasVersion danych. Dostęp do jednej z wersji rekordu można uzyskać, przekazując DataRowVersion wartość wyliczenia jako opcjonalny argument podczas żądania wartości kolumny.

Pobieranie zmienionych rekordów

Często zdarza się, aby nie aktualizować każdego rekordu w zestawie danych. Na przykład użytkownik może pracować z kontrolką Windows Forms DataGridView , która wyświetla wiele rekordów. Jednak użytkownik może zaktualizować tylko kilka rekordów, usunąć jeden i wstawić nowy. Zestawy danych i tabele danych udostępniają metodę (GetChanges) dla zwracania tylko wierszy, które zostały zmodyfikowane.

Można tworzyć podzestawy zmienionych rekordów przy użyciu GetChanges metody tabeli danych (GetChanges) lub samego zestawu danych (GetChanges). Jeśli wywołasz metodę dla tabeli danych, zwraca ona kopię tabeli z tylko zmienionymi rekordami. Podobnie, jeśli wywołasz metodę w zestawie danych, otrzymasz nowy zestaw danych z tylko zmienionymi rekordami.

GetChanges program sam zwraca wszystkie zmienione rekordy. Natomiast przekazanie żądanego DataRowState parametru jako parametru GetChanges do metody umożliwia określenie, który podzbiór zmienionych rekordów ma być określony: nowo dodane rekordy, rekordy oznaczone do usunięcia, odłączone rekordy lub zmodyfikowane rekordy.

Uzyskanie podzbioru zmienionych rekordów jest przydatne, gdy chcesz wysyłać rekordy do innego składnika do przetwarzania. Zamiast wysyłać cały zestaw danych, możesz zmniejszyć nakład pracy związany z komunikacją z innym składnikiem, uzyskując tylko rekordy wymagane przez składnik.

Zatwierdzanie zmian w zestawie danych

W miarę wprowadzania zmian w zestawie danych RowState właściwość zmienionych wierszy jest ustawiana. Oryginalne i bieżące wersje rekordów są ustanawiane, utrzymywane i udostępniane przez RowVersion właściwość. Metadane przechowywane we właściwościach tych zmienionych wierszy są niezbędne do wysyłania poprawnych aktualizacji do źródła danych.

Jeśli zmiany odzwierciedlają bieżący stan źródła danych, nie trzeba już utrzymywać tych informacji. Zazwyczaj występuje dwa razy, gdy zestaw danych i jego źródło są zsynchronizowane:

  • Natychmiast po załadowaniu informacji do zestawu danych, na przykład podczas odczytywania danych ze źródła.

  • Po wysłaniu zmian z zestawu danych do źródła danych (ale nie wcześniej, ponieważ utracisz informacje o zmianie wymagane do wysyłania zmian do bazy danych).

Oczekujące zmiany w zestawie danych można zatwierdzić, wywołując metodę AcceptChanges . AcceptChanges Zazwyczaj jest wywoływana w następujących godzinach:

  • Po załadowaniu zestawu danych. Jeśli załadujesz zestaw danych przez wywołanie metody TableAdapter Fill , karta automatycznie zatwierdza zmiany. Jeśli jednak załadujesz zestaw danych przez scalenie z nim innego zestawu danych, musisz zatwierdzić zmiany ręcznie.

    Uwaga

    Możesz uniemożliwić adapterowi automatyczne zatwierdzanie zmian podczas wywoływania Fill metody przez ustawienie AcceptChangesDuringFill właściwości adaptera na false. Jeśli jest ustawiona wartość false, dla RowState każdego wiersza wstawionego podczas wypełniania ustawiono wartość Added.

  • Po wysłaniu zmian zestawu danych do innego procesu, takiego jak usługa internetowa XML.

    Uwaga

    Zatwierdzanie zmiany w ten sposób powoduje usunięcie wszelkich informacji o zmianach. Nie zatwierdzaj zmian dopiero po zakończeniu wykonywania operacji, które wymagają, aby aplikacja wiedziała, jakie zmiany zostały wprowadzone w zestawie danych.

Ta metoda wykonuje następujące czynności:

Metoda AcceptChanges jest dostępna na trzech poziomach. Można wywołać go na DataRow obiekcie, aby zatwierdzić zmiany tylko dla tego wiersza. Można również wywołać go w DataTable obiekcie, aby zatwierdzić wszystkie wiersze w tabeli. Na koniec można wywołać go w DataSet obiekcie, aby zatwierdzić wszystkie oczekujące zmiany we wszystkich rekordach wszystkich tabel zestawu danych.

W poniższej tabeli opisano, które zmiany są zatwierdzane w oparciu o obiekt wywoływany przez metodę:

Method Result
System.Data.DataRow.AcceptChanges Zmiany są zatwierdzane tylko w określonym wierszu.
System.Data.DataTable.AcceptChanges Zmiany są zatwierdzane we wszystkich wierszach w określonej tabeli.
System.Data.DataSet.AcceptChanges Zmiany są zatwierdzane we wszystkich wierszach we wszystkich tabelach zestawu danych.

Uwaga

W przypadku ładowania zestawu danych przez wywołanie metody TableAdapter Fill nie trzeba jawnie akceptować zmian. Domyślnie Fill metoda wywołuje metodę AcceptChanges po zakończeniu wypełniania tabeli danych.

Powiązana metoda RejectChanges, , cofa efekt zmian, kopiując Original wersję z powrotem do Current wersji rekordów. Ustawia RowState również każdy rekord z powrotem na Unchanged.

Sprawdzanie poprawności danych

Aby sprawdzić, czy dane w aplikacji spełniają wymagania procesów, do których są przekazywane, często trzeba dodać walidację. Może to obejmować sprawdzenie, czy wpis użytkownika w formularzu jest poprawny, weryfikowanie danych wysyłanych do aplikacji przez inną aplikację, a nawet sprawdzanie, czy informacje obliczane w składniku mieszczą się w ograniczeniach źródła danych i wymagań aplikacji.

Dane można zweryfikować na kilka sposobów:

  • W warstwie biznesowej przez dodanie kodu do aplikacji w celu zweryfikowania danych. Zestaw danych to jedno miejsce, w którym można to zrobić. Zestaw danych zapewnia niektóre zalety walidacji zaplecza — takie jak możliwość weryfikowania zmian w miarę zmieniania wartości kolumn i wierszy. Aby uzyskać więcej informacji, zobacz Weryfikowanie danych w zestawach danych.

  • W warstwie prezentacji przez dodanie walidacji do formularzy. Aby uzyskać więcej informacji, zobacz Walidacja danych wejściowych użytkownika w formularzach systemu Windows.

  • W zapleczu danych, wysyłając dane do źródła danych — na przykład bazę danych — i umożliwiając jej akceptowanie lub odrzucanie danych. Jeśli pracujesz z bazą danych, która ma zaawansowane funkcje sprawdzania poprawności danych i dostarczania informacji o błędach, może to być praktyczne podejście, ponieważ można zweryfikować dane niezależnie od tego, skąd pochodzą. Jednak takie podejście może nie spełniać wymagań weryfikacji specyficznych dla aplikacji. Ponadto posiadanie źródła danych weryfikujące dane może spowodować wiele rund do źródła danych, w zależności od tego, w jaki sposób aplikacja ułatwia rozwiązywanie błędów walidacji zgłaszanych przez zaplecze.

    Ważne

    W przypadku używania poleceń danych z właściwością ustawioną CommandType na Textwartość należy dokładnie sprawdzić informacje wysyłane z klienta przed przekazaniem ich do bazy danych. Złośliwi użytkownicy mogą próbować wysłać (wstrzykiwać) zmodyfikowane lub dodatkowe instrukcje SQL w celu uzyskania nieautoryzowanego dostępu lub uszkodzenia bazy danych. Przed przeniesieniem danych wejściowych użytkownika do bazy danych należy zawsze sprawdzić, czy informacje są prawidłowe. Najlepszym rozwiązaniem jest zawsze używanie sparametryzowanych zapytań lub procedur składowanych, jeśli jest to możliwe.

Przesyłanie aktualizacji do źródła danych

Po wprowadzeniu zmian w zestawie danych można przesyłać zmiany do źródła danych. Najczęściej jest to możliwe przez wywołanie Update metody TableAdapter (lub karty danych). Metoda przechodzi przez każdy rekord w tabeli danych, określa wymagany typ aktualizacji (aktualizacja, wstawianie lub usuwanie), jeśli istnieje, a następnie uruchamia odpowiednie polecenie.

Na ilustracji przedstawiającej sposób opracowywania aktualizacji załóżmy, że aplikacja używa zestawu danych zawierającego jedną tabelę danych. Aplikacja pobiera dwa wiersze z bazy danych. Po pobraniu tabela danych w pamięci wygląda następująco:

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Unchanged)    c400         Nancy Buchanan    Pending

Twoja aplikacja zmienia stan Nancy Buchanan na "Preferowane". W wyniku tej zmiany wartość RowState właściwości tego wiersza zmienia się z Unchanged na Modified. Wartość RowState właściwości dla pierwszego wiersza pozostaje następująca Unchanged: . Tabela danych wygląda teraz następująco:

(RowState)     CustomerID   Name             Status
(Unchanged)    c200         Robert Lyon      Good
(Modified)     c400         Nancy Buchanan    Preferred

Aplikacja wywołuje teraz metodę Update w celu przesłania zestawu danych do bazy danych. Metoda sprawdza po kolei każdy wiersz. W pierwszym wierszu metoda nie przesyła instrukcji SQL do bazy danych, ponieważ ten wiersz nie uległ zmianie, ponieważ został pierwotnie pobrany z bazy danych.

Jednak w drugim wierszu Update metoda automatycznie wywołuje poprawne polecenie danych i przesyła je do bazy danych. Określona składnia instrukcji SQL zależy od dialektu SQL obsługiwanego przez bazowy magazyn danych. Jednak następujące ogólne cechy przekazanej instrukcji SQL są godne uwagi:

  • Przesłana instrukcja SQL jest instrukcją UPDATE . Karta wie, że używa instrukcji UPDATE , ponieważ wartość RowState właściwości to Modified.

  • Przesłana instrukcja SQL zawiera klauzulę wskazującą WHERE , że elementem docelowym instrukcji UPDATE jest wiersz, w którym CustomerID = 'c400'. Ta część instrukcji SELECT odróżnia wiersz docelowy od wszystkich innych, ponieważ CustomerID element jest kluczem podstawowym tabeli docelowej. Informacje dotyczące WHERE klauzuli pochodzą z oryginalnej wersji rekordu (DataRowVersion.Original), w przypadku zmiany wartości wymaganych do zidentyfikowania wiersza.

  • Przesłana instrukcja SQL zawiera klauzulę SET , aby ustawić nowe wartości zmodyfikowanych kolumn.

    Uwaga

    Jeśli właściwość TableAdapter UpdateCommand została ustawiona na nazwę procedury składowanej, karta nie tworzy instrukcji SQL. Zamiast tego wywołuje procedurę składowaną z odpowiednimi przekazanymi parametrami.

Przekazywanie parametrów

Zazwyczaj używasz parametrów do przekazywania wartości rekordów, które mają zostać zaktualizowane w bazie danych. Gdy metoda TableAdapter Update uruchamia instrukcję UPDATE , musi wypełnić wartości parametrów. Pobiera te wartości z Parameters kolekcji dla odpowiedniego polecenia danych — w tym przypadku UpdateCommand obiekt w tabeli TableAdapter.

Jeśli użyto narzędzi programu Visual Studio do wygenerowania karty danych, UpdateCommand obiekt zawiera kolekcję parametrów odpowiadających każdemu symbolowi zastępczemu parametrów w instrukcji .

Właściwość System.Data.SqlClient.SqlParameter.SourceColumn każdego parametru wskazuje kolumnę w tabeli danych. Na przykład SourceColumn właściwość parametrów au_id i Original_au_id jest ustawiona na dowolną kolumnę w tabeli danych zawierającą identyfikator autora. Po uruchomieniu metody adaptera Update odczytuje kolumnę identyfikatora autora z rekordu, który jest aktualizowany i wypełnia wartości w instrukcji .

W instrukcji UPDATE należy określić zarówno nowe wartości (te, które zostaną zapisane w rekordzie), jak i stare wartości (aby rekord mógł znajdować się w bazie danych). W związku z tym istnieją dwa parametry dla każdej wartości: jeden dla SET klauzuli i inny dla klauzuli WHERE . Oba parametry odczytują dane z rekordu, który jest aktualizowany, ale otrzymują różne wersje wartości kolumny na podstawie właściwości parametru SourceVersion . Parametr klauzuli SET pobiera bieżącą wersję, a parametr klauzuli WHERE pobiera oryginalną wersję.

Uwaga

Wartości w Parameters kolekcji można również ustawić samodzielnie w kodzie, co zwykle odbywa się w procedurze obsługi zdarzeń dla zdarzenia karty RowChanging danych.