Wypełnianie zestawów danych przy użyciu elementów TableAdapters 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. Technologie te są 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.
Składnik TableAdapter wypełnia zestaw danych danymi z bazy danych na podstawie co najmniej jednego zapytania lub procedur składowanych, które określisz. Klasy TableAdapters mogą również wykonywać operacje dodawania, aktualizacji i usuwania w bazie danych w celu utrwalania zmian w zestawie danych. Możesz również wydać polecenia globalne, które nie są powiązane z dowolną konkretną tabelą.
Uwaga
Klasy TableAdapters są generowane przez projektantów programu Visual Studio. Jeśli tworzysz zestawy danych programowo, użyj klasy DataAdapter, która jest klasą .NET.
Aby uzyskać szczegółowe informacje na temat operacji TableAdapter, możesz przejść bezpośrednio do jednego z następujących tematów:
Temat | opis |
---|---|
Tworzenie i konfigurowanie adapterów TableAdapter | Jak używać projektantów do tworzenia i konfigurowania elementów TableAdapters |
Tworzenie sparametryzowanych zapytań adaptera TableAdapter | Jak umożliwić użytkownikom dostarczanie argumentów do procedur lub zapytań TableAdapter |
Bezpośredni dostęp do bazy danych za pomocą adaptera TableAdapter | Jak używać metod Dbdirect tabelAdapters |
Wyłączanie ograniczeń podczas zapełniania zestawu danych | Jak pracować z ograniczeniami klucza obcego podczas aktualizowania danych |
Jak rozszerzyć funkcjonalność elementu TableAdapter | How to add custom code to TableAdapters |
Odczytywanie danych XML do zestawu danych | Jak pracować z kodem XML |
Omówienie elementu TableAdapter
Klasy TableAdapters to składniki generowane przez projektanta, które łączą się z bazą danych, uruchamiają zapytania lub procedury składowane i wypełniają tabelę DataTable zwróconymi danymi. Narzędzia TableAdapters wysyłają również zaktualizowane dane z aplikacji z powrotem do bazy danych. Można uruchamiać dowolną liczbę zapytań w tabeli TableAdapter, o ile zwracają one dane zgodne ze schematem tabeli, z którą jest skojarzony element TableAdapter. Na poniższym diagramie przedstawiono sposób interakcji elementów TableAdapters z bazami danych i innymi obiektami w pamięci:
Chociaż klasy TableAdapters są projektowane przy użyciu projektanta zestawów danych, klasy TableAdapter nie są generowane jako zagnieżdżone klasy DataSetklasy . Znajdują się one w oddzielnych przestrzeniach nazw specyficznych dla każdego zestawu danych. Jeśli na przykład masz zestaw danych o nazwie NorthwindDataSet
, elementy TableAdapters skojarzone z elementami DataTables w NorthwindDataSet
przestrzeni nazw będą znajdować NorthwindDataSetTableAdapters
się w przestrzeni nazw. Aby uzyskać dostęp do określonego obiektu TableAdapter programowo, należy zadeklarować nowe wystąpienie klasy TableAdapter. Na przykład:
NorthwindDataSet northwindDataSet = new NorthwindDataSet();
NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter =
new NorthwindDataSetTableAdapters.CustomersTableAdapter();
customersTableAdapter.Fill(northwindDataSet.Customers);
Skojarzony schemat dataTable
Podczas tworzenia obiektu TableAdapter należy użyć początkowego zapytania lub procedury składowanej do zdefiniowania schematu skojarzonego DataTableobiektu TableAdapter. To początkowe zapytanie lub procedura składowana jest uruchamiane przez wywołanie metody TableAdapter Fill
(która wypełnia skojarzone z DataTabletabelą ). Wszelkie zmiany wprowadzone w głównym zapytaniu tableAdapter są odzwierciedlane w schemacie skojarzonej tabeli danych. Na przykład usunięcie kolumny z zapytania głównego spowoduje również usunięcie kolumny ze skojarzonej tabeli danych. Jeśli jakiekolwiek dodatkowe zapytania w tableAdapter używają instrukcji SQL, które zwracają kolumny, które nie znajdują się w głównym zapytaniu, projektant próbuje zsynchronizować zmiany kolumny między zapytaniem głównym a dodatkowymi zapytaniami.
Polecenia aktualizacji tableAdapter
Funkcja aktualizacji elementu TableAdapter zależy od ilości informacji dostępnych w głównym zapytaniu Kreatora tableAdapter. Na przykład klasy TableAdapters skonfigurowane do pobierania wartości z wielu tabel (przy użyciu JOIN
), wartości skalarnych, widoków lub wyników funkcji agregujących nie są początkowo tworzone z możliwością wysyłania aktualizacji z powrotem do bazowej bazy danych. Można jednak ręcznie skonfigurować INSERT
polecenia , UPDATE
i DELETE
w oknie Właściwości .
TableAdapter— Zapytania
Tabele TableAdapters mogą zawierać wiele zapytań w celu wypełnienia skojarzonych tabel danych. Można zdefiniować dowolną liczbę zapytań dla klasy TableAdapter, ile wymaga aplikacja, o ile każde zapytanie zwraca dane zgodne z tym samym schematem co skojarzona tabela danych. Ta funkcja umożliwia modułowi TableAdapter ładowanie różnych wyników na podstawie różnych kryteriów.
Jeśli na przykład aplikacja zawiera tabelę z nazwami klientów, możesz utworzyć zapytanie, które wypełnia tabelę wszystkimi nazwami klientów rozpoczynającymi się od określonej litery, a drugą, która wypełnia tabelę wszystkimi klientami znajdującymi się w tym samym stanie. Aby wypełnić tabelę Customers
z klientami w danym stanie, możesz utworzyć FillByState
zapytanie, które przyjmuje parametr dla wartości stanu w następujący sposób: SELECT * FROM Customers WHERE State = @State
. Zapytanie jest uruchamiane przez wywołanie FillByState
metody i przekazanie wartości parametru w następujący sposób: CustomerTableAdapter.FillByState("WA")
.
Oprócz dodawania zapytań, które zwracają dane tego samego schematu co tabela danych tableAdapter, można dodawać zapytania zwracające wartości skalarne (pojedyncze). Na przykład zapytanie zwracające liczbę klientów (SELECT Count(*) From Customers
) jest prawidłowe, CustomersTableAdapter,
mimo że zwrócone dane nie są zgodne ze schematem tabeli.
Właściwość ClearBeforeFill
Domyślnie za każdym razem, gdy uruchamiasz zapytanie w celu wypełnienia tabeli danych tableAdapter, istniejące dane są czyszczone i tylko wyniki zapytania są ładowane do tabeli. Ustaw właściwość TableAdapter ClearBeforeFill
na false
wartość , jeśli chcesz dodać lub scalić dane zwrócone z zapytania do istniejących danych w tabeli danych. Niezależnie od tego, czy wyczyścisz dane, musisz jawnie wysłać aktualizacje z powrotem do bazy danych, jeśli chcesz je utrwały. Pamiętaj, aby zapisać wszelkie zmiany w danych w tabeli przed uruchomieniem innego zapytania, które wypełnia tabelę. Aby uzyskać więcej informacji, zobacz Aktualizowanie danych przy użyciu elementu TableAdapter.
Dziedziczenie tableAdapter
Klasy TableAdapters rozszerzają funkcjonalność standardowych kart danych, hermetyzując skonfigurowaną DataAdapter klasę. Domyślnie klasa TableAdapter dziedziczy z Component klasy i nie może być rzutowany na klasę DataAdapter . Rzutowanie obiektu TableAdapter do DataAdapter klasy powoduje wystąpienie InvalidCastException błędu. Aby zmienić klasę bazową klasy TableAdapter, można określić klasę, która pochodzi z Component właściwości Klasa podstawowa klasy TableAdapter w Projektancie zestawów danych.
Metody i właściwości tableAdapter
Klasa TableAdapter nie jest typem platformy .NET. Oznacza to, że nie można go wyszukać w dokumentacji ani w przeglądarce obiektów. Jest on tworzony w czasie projektowania, gdy używasz jednego z wymienionych wcześniej kreatorów. Nazwa przypisana do obiektu TableAdapter podczas jego tworzenia zależy od nazwy tabeli, z którą pracujesz. Na przykład podczas tworzenia obiektu TableAdapter na podstawie tabeli w bazie danych o nazwie Orders
, parametr TableAdapter ma nazwę OrdersTableAdapter
. Nazwę klasy tableAdapter można zmienić przy użyciu właściwości Name w Projektancie zestawów danych.
Poniżej przedstawiono powszechnie używane metody i właściwości klasy TableAdapters:
Element członkowski | opis |
---|---|
TableAdapter.Fill |
Wypełnia skojarzona tabela danych TableAdapter wynikami polecenia TableAdapter SELECT . |
TableAdapter.Update |
Wysyła zmiany z powrotem do bazy danych i zwraca liczbę całkowitą reprezentującą liczbę wierszy, których dotyczy aktualizacja. Aby uzyskać więcej informacji, zobacz Aktualizowanie danych przy użyciu elementu TableAdapter. |
TableAdapter.GetData |
Zwraca nowy DataTable element wypełniony danymi. |
TableAdapter.Insert |
Tworzy nowy wiersz w tabeli danych. Aby uzyskać więcej informacji, zobacz Wstawianie nowych rekordów do bazy danych. |
TableAdapter.ClearBeforeFill |
Określa, czy tabela danych jest opróżniona przed wywołaniem jednej z Fill metod. |
TableAdapter, metoda aktualizacji
Narzędzia TableAdapters używają poleceń danych do odczytywania i zapisywania z bazy danych. Użyj początkowego Fill
(głównego) zapytania tableAdapter jako podstawy do utworzenia schematu skojarzonej tabeli danych, a także InsertCommand
poleceń , UpdateCommand
i DeleteCommand
skojarzonych z TableAdapter.Update
metodą . Wywołanie metody TableAdapter Update
powoduje uruchomienie instrukcji utworzonych podczas pierwotnie skonfigurowanego elementu TableAdapter, a nie jednego z dodatkowych zapytań dodanych za pomocą Kreatora konfiguracji zapytań TableAdapter.
Gdy używasz obiektu TableAdapter, skutecznie wykonuje te same operacje za pomocą poleceń, które zwykle będą wykonywane. Na przykład podczas wywoływania metody karty karta Fill
uruchamia polecenie danych we właściwości SelectCommand
i używa czytnika danych (na przykład SqlDataReader) do załadowania zestawu wyników do tabeli danych. Podobnie podczas wywoływania metody karty Update
uruchamia odpowiednie polecenie (w UpdateCommand
właściwościach , InsertCommand
i DeleteCommand
) dla każdego zmienionego rekordu w tabeli danych.
Uwaga
Jeśli w zapytaniu głównym znajduje się wystarczająca ilość informacji, InsertCommand
polecenia , UpdateCommand
i są DeleteCommand
tworzone domyślnie po wygenerowaniu elementu TableAdapter. Jeśli główne zapytanie tableAdapter jest więcej niż pojedyncza instrukcja tabeli SELECT
, możliwe, że projektant nie będzie mógł wygenerować InsertCommand
, UpdateCommand
i DeleteCommand
. Jeśli te polecenia nie są generowane, może zostać wyświetlony błąd podczas uruchamiania TableAdapter.Update
metody.
TableAdapter GenerateDbDirectMethods
Oprócz InsertCommand
elementów , UpdateCommand
i DeleteCommand
, klasy TableAdapters są tworzone za pomocą metod, które można uruchamiać bezpośrednio w bazie danych. Te metody (TableAdapter.Insert
, TableAdapter.Update
, i TableAdapter.Delete
) można wywoływać bezpośrednio w celu manipulowania danymi w bazie danych. Oznacza to, że można wywołać te poszczególne metody z kodu zamiast wywoływania TableAdapter.Update
w celu obsługi wstawiania, aktualizacji i usuwania oczekujących dla skojarzonej tabeli danych.
Jeśli nie chcesz tworzyć tych metod bezpośrednich, ustaw właściwość GenerateDbDirectMethods klasy TableAdapter na false
wartość (w oknie Właściwości). Dodatkowe zapytania dodawane do klasy TableAdapter są zapytaniami autonomicznymi — nie generują tych metod.
Obsługa funkcji TableAdapter dla typów dopuszczanych do wartości null
Moduły TableAdapters obsługują typy Nullable(Of T)
dopuszczane do wartości null i T?
. Aby uzyskać więcej informacji na temat typów dopuszczanych do wartości null w Visual Basic, zobacz Typy wartości dopuszczanych do wartości null. Aby uzyskać więcej informacji na temat typów dopuszczanych do wartości null w języku C#, zobacz Use nullable types (Używanie typów dopuszczanych do wartości null).
Dokumentacja narzędzia TableAdapterManager
Domyślnie klasa TableAdapterManager jest generowana podczas tworzenia zestawu danych zawierającego powiązane tabele. Aby zapobiec generowaniu klasy, zmień wartość Hierarchical Update
właściwości zestawu danych na false. Przeciągając tabelę, która ma relację na powierzchni projektowej strony Formularz systemu Windows lub WPF, program Visual Studio deklaruje zmienną składową klasy. Jeśli nie używasz powiązania danych, musisz ręcznie zadeklarować zmienną.
Klasa TableAdapterManager nie jest typem platformy .NET. W związku z tym nie można go wyszukać w dokumentacji. Jest on tworzony w czasie projektowania w ramach procesu tworzenia zestawu danych.
Poniżej przedstawiono często używane metody i właściwości TableAdapterManager
klasy:
Element członkowski | opis |
---|---|
UpdateAll metoda |
Zapisuje wszystkie dane ze wszystkich tabel danych. |
BackUpDataSetBeforeUpdate własność |
Określa, czy należy utworzyć kopię zapasową zestawu danych przed wykonaniem TableAdapterManager.UpdateAll metody. Boolowski. |
właściwość tableName TableAdapter |
Reprezentuje obiekt TableAdapter. Wygenerowany element TableAdapterManager zawiera właściwość dla każdego TableAdapter , którym zarządza. Na przykład zestaw danych z tabelą Customers (Klienci) i Orders (Zamówienia) jest generowany za pomocą klasy TableAdapterManager zawierającej CustomersTableAdapter właściwości i OrdersTableAdapter . |
UpdateOrder własność |
Określa kolejność poszczególnych poleceń wstawiania, aktualizowania i usuwania. Ustaw tę wartość na jedną z wartości w wyliczenie TableAdapterManager.UpdateOrderOption .Domyślnie właściwość jest ustawiona UpdateOrder na InsertUpdateDelete. Oznacza to, że operacje wstawiania, a następnie aktualizacji, a następnie usuwania są wykonywane dla wszystkich tabel w zestawie danych. |
Zabezpieczenia
Jeśli używasz poleceń danych z właściwością CommandType ustawioną na Text, dokładnie sprawdź 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.