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. 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.

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:

Data flow in a client application

Chociaż klasy TableAdapters są projektowane przy użyciu Projektant Dataset, 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ć INSERTpolecenia , UPDATEi DELETE w oknie Właściwości .

TableAdapter— Zapytania

TableAdapter with multiple queries

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 obiektu TableAdapter w zestawie danych Projektant.

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 Projektant Dataset.

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 InsertCommandpoleceń , UpdateCommandi 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 UpdateCommandwłaściwościach , InsertCommandi DeleteCommand ) dla każdego zmienionego rekordu w tabeli danych.

Uwaga

Jeśli w zapytaniu głównym znajduje się wystarczająca ilość informacji, InsertCommandpolecenia , UpdateCommandi 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, UpdateCommandi DeleteCommand. Jeśli te polecenia nie są generowane, może zostać wyświetlony błąd podczas uruchamiania TableAdapter.Update metody.

TableAdapter GenerateDbDirectMethods

Oprócz InsertCommandelementów , UpdateCommandi 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łaściwość Określa, czy należy utworzyć kopię zapasową zestawu danych przed wykonaniem TableAdapterManager.UpdateAll metody. Boolean.
właściwość tableNameTableAdapter 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łaściwość 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.