Wypełnianie zestawów danych przy użyciu elementów TableAdapters w aplikacjach .NET Framework
Notatka
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 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ą także wykonywać operacje dodawania, aktualizacji i usuwania w bazie danych, aby zapisywać wprowadzone zmiany w zestawie danych. Ponadto można wydać polecenia globalne niepowiązane z dowolną konkretną tabelą.
Notatka
Projektanci programu Visual Studio generują TableAdapters. Jeśli tworzysz zestawy danych programowo, użyj klasy DataAdapter
.NET.
Aby uzyskać szczegółowe informacje na temat operacji TableAdapter, możesz przejść bezpośrednio do jednego z następujących artykułów:
Artykuł | Opis |
---|---|
Tworzenie i konfigurowanie TableAdapters | Dowiedz się, jak używać projektantów do tworzenia i konfigurowania elementów TableAdapters. |
Tworzenie sparametryzowanych zapytań TableAdapter | Dowiedz się, jak umożliwić użytkownikom dostarczanie argumentów do procedur lub zapytań tableAdapter. |
Bezpośredni dostęp do bazy danych za pomocą TableAdaptera | Dowiedz się, jak używać metod DbDirect TableAdapters. |
Wyłącz ograniczenia podczas wypełniania zestawu danych | Dowiedz się, jak pracować z ograniczeniami klucza obcego podczas aktualizowania danych. |
Rozszerz funkcjonalność TableAdapter | Dowiedz się, jak dodać kod niestandardowy do elementów TableAdapters. |
Importuj dane XML do zestawu danych | Dowiedz się, jak pracować z danymi XML w zestawie danych. |
Omówienie TableAdapter
TableAdapters to komponenty generowane przez projektanta, które łączą się z bazą danych, uruchamiają zapytania lub procedury składowane i wypełniają swoją 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 zwraca dane zgodne ze schematem skojarzonej tabeli. Na poniższym diagramie przedstawiono sposób interakcji elementów TableAdapters z bazami danych i innymi obiektami w pamięci:
Mimo że klasy TableAdapters zostały zaprojektowane przy użyciu Projektanta Zestawów Danych, klasy TableAdapter
nie są generowane jako zagnieżdżone klasy DataSet. Zamiast tego znajdują się one w oddzielnych przestrzeniach nazw specyficznych dla każdego zestawu danych. Jeśli na przykład masz zestaw danych o nazwie NorthwindDataSet
, obiekty TableAdapters skojarzone z obiektami DataTable w NorthwindDataSet
znajdują się w przestrzeni nazw NorthwindDataSetTableAdapters
. Aby uzyskać dostęp do określonej klasy TableAdapter programowo, zadeklaruj 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 TableAdaptera należy użyć początkowego zapytania lub procedury składowanej do zdefiniowania schematu skojarzonego DataTableTableAdapter. Uruchamiasz to początkowe zapytanie lub procedurę składowaną, wywołując metodę Fill
TableAdaptera, która wypełnia skojarzone z nim DataTable. Wszelkie zmiany wprowadzone w głównym zapytaniu tableAdapter są odzwierciedlane w schemacie skojarzonej tabeli danych. Jeśli na przykład usuniesz kolumnę z zapytania głównego, Projektant zestawów danych usunie również kolumnę ze skojarzonej tabeli danych. Jeśli jakiekolwiek dodatkowe zapytania dotyczące obiektu TableAdapter używają instrukcji SQL, które zwracają kolumny, które nie znajdują się w zapytaniu głównym, projektant zestawów danych próbuje zsynchronizować zmiany kolumny między zapytaniem głównym a dodatkowymi zapytaniami.
Polecenia aktualizacji TableAdaptera
Funkcjonalność aktualizacji TableAdaptera zależy od dostępności informacji w głównym zapytaniu w kreatorze 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 skonfigurować właściwości InsertCommand, UpdateCommandi DeleteCommand ręcznie w oknie Właściwości .
Zapytania TableAdapter
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ę przy użyciu każdej nazwy klienta rozpoczynającej się od określonej litery. Możesz utworzyć kolejne zapytanie, które wypełnia tabelę wszystkimi klientami znajdującymi się w tym samym stanie. Aby wypełnić tabelę Customers
z klientami w danym stanie, utwórz zapytanie FillByState
, które przyjmuje parametr dla wartości stanu w następujący sposób: SELECT * FROM Customers WHERE State = @State
. Uruchom zapytanie, wywołując metodę FillByState
i przekazując wartość parametru, na przykład: 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 dla 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. Jeśli chcesz dodać lub scalić dane zwracane przez zapytanie do istniejących danych w tabeli danych, ustaw właściwość TableAdapter ClearBeforeFill
na wartość false
. Niezależnie od tego, czy wyczyścisz dane, musisz jawnie wysłać aktualizacje z powrotem do bazy danych, jeśli chcesz je utrwały. W związku z tym przed uruchomieniem innego zapytania wypełniającego tabelę upewnij się, że zapiszesz wszelkie zmiany w danych w tabeli. Aby uzyskać więcej informacji, zobacz Aktualizuj dane, używając TableAdapter.
Dziedziczenie TableAdapter
Klasy TableAdapters rozszerzają funkcjonalność standardowych adapterów danych, hermetyzując skonfigurowaną klasę DataAdapter. Domyślnie klasa TableAdapter dziedziczy z klasy Component i nie może być rzutowana na klasę DataAdapter. Rzutowanie klasy TableAdapter do klasy DataAdapter powoduje błąd InvalidCastException. Aby zmienić klasę bazową klasy TableAdapter, określ klasę, która pochodzi z klasy Component we właściwości Klasa podstawowa właściwości TableAdapter w Projektancie zestawów danych.
Metody i właściwości tableAdapter
Klasa TableAdapter
nie jest typem platformy .NET, co oznacza, że nie można wyszukać jej w przeglądarce obiektów ani dokumentacji referencyjnej. Program Visual Studio tworzy go w czasie projektowania, gdy używasz jednego z opisanych wcześniej kreatorów. Nazwa przypisywana przez program Visual Studio do utworzonego obiektu TableAdapter jest oparta na nazwie 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
. Aby zmienić nazwę klasy TableAdapter, użyj właściwości Name w oknie właściwości Projektanta DataSet .
Powszechnie używane metody i właściwości klasy TableAdapter są następujące:
Członek | Opis |
---|---|
TableAdapter.Fill |
Wypełnia skojarzoną tabelę danych TableAdapter wynikami polecenia TableAdaptera 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 Aktualizuj dane za pomocą TableAdaptera. |
TableAdapter.GetData |
Zwraca nowy DataTable 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 metod Fill . |
TableAdapter, metoda aktualizacji
Narzędzia TableAdapters używają poleceń danych do odczytywania i zapisywania z bazy danych. Użyj początkowego zapytania Fill
(głównego) tabeli TableAdapter jako podstawy do utworzenia schematu skojarzonej tabeli danych oraz InsertCommand
, UpdateCommand
i DeleteCommand
poleceń skojarzonych z metodą TableAdapter.Update
. Gdy wywołujesz metodę Update
TableAdapter, uruchamiane są instrukcje utworzone podczas pierwotnej konfiguracji TableAdapter, a nie jedno 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 wykonujesz. Na przykład, gdy wywołujesz metodę Fill
adaptera, adapter 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, wywołując metodę Update
adaptera, uruchamiasz odpowiednie polecenie w właściwościach UpdateCommand
, InsertCommand
i DeleteCommand
dla każdego zmienionego rekordu w tabeli danych.
Uwaga
Jeśli główne zapytanie zawiera wystarczającą ilość informacji, projektant tworzy InsertCommand
, UpdateCommand
i DeleteCommand
polecenia domyślnie, gdy projektant generuje obiekt TableAdapter. Jeśli jednak główne zapytanie TableAdapter składa się z więcej niż jednej instrukcji dla tabeli SELECT
, projektant może nie być w stanie wygenerować tych poleceń. W takim przypadku może wystąpić błąd podczas uruchamiania metody TableAdapter.Update
.
TableAdapter GenerateDbDirectMethods
Oprócz InsertCommand
, UpdateCommand
i DeleteCommand
, TableAdaptery są tworzone za pomocą następujących metod, które można uruchamiać bezpośrednio w bazie danych: TableAdapter.Insert
, TableAdapter.Update
i TableAdapter.Delete
. Te metody można wywoływać bezpośrednio w celu manipulowania danymi w bazie danych. Oznacza to, że można wywołać poszczególne metody z twojego kodu, zamiast wywoływać TableAdapter.Update
w celu obsługi oczekujących wstawień, aktualizacji i usunięć dla skojarzonej tabeli danych.
Jeśli nie chcesz tworzyć tych metod bezpośrednich, ustaw właściwość GenerateDbDirectMethods obiektu TableAdapter na False w oknie Properties. Dodatkowe zapytania dodawane do klasy TableAdapter to autonomiczne zapytania, które nie generują tych metod.
Obsługa funkcji TableAdapter dla typów mogących przyjmować wartość null
Moduły TableAdapters obsługują typy nullable Nullable<T>
i T?
. Aby uzyskać więcej informacji na temat typów dopuszczających wartość null w Visual Basic, zobacz typy wartości dopuszczających wartość null (Visual Basic). Aby uzyskać więcej informacji na temat typów dopuszczających wartości null w języku C#, zobacz typy wartości dopuszczające null (C#).
Dokumentacja narzędzia TableAdapterManager
Domyślnie program Visual Studio generuje klasę TableAdapterManager
podczas tworzenia zestawu danych zawierającego powiązane tabele. Aby zapobiec generowaniu klasy, zmień wartość właściwości Hierarchical Update
zestawu danych na false
. Przeciągając tabelę, która ma relację, na powierzchnię projektową formularza Windows lub strony WPF, program Visual Studio deklaruje zmienną składową klasy. Jeśli nie używasz powiązania danych, musisz ręcznie zadeklarować zmienną.
Ponieważ klasa TableAdapterManager
nie jest typem platformy .NET, nie jest wyświetlana w dokumentacji referencyjnej. Program Visual Studio tworzy go w czasie projektowania w ramach procesu tworzenia zestawu danych.
W poniższej tabeli wymieniono często używane metody i właściwości klasy TableAdapterManager
:
Członek | Opis |
---|---|
Metoda UpdateAll |
Zapisuje wszystkie dane ze wszystkich tabel danych. |
właściwość BackUpDataSetBeforeUpdate |
Określa, czy należy utworzyć kopię zapasową zestawu danych przed wykonaniem TableAdapterManager.UpdateAll method.Boolean . |
właściwość tableNameTableAdapter |
Reprezentuje obiekt TableAdapter. Wygenerowany TableAdapterManager zawiera właściwość dla każdego TableAdapter , którym zarządza. Na przykład zestaw danych z tabelami Klienci i Zamówienia generuje się za pomocą elementu TableAdapterManager, który zawiera właściwości CustomersTableAdapter i OrdersTableAdapter . |
właściwość UpdateOrder |
Określa kolejność poszczególnych poleceń wstawiania, aktualizowania i usuwania. Ustaw tę właściwość na jedną z wartości w danym wyliczeniu TableAdapterManager.UpdateOrderOption .Domyślnie UpdateOrder jest ustawiona na InsertUpdateDelete , co oznacza, że operacje wstawiania, aktualizacji, a następnie usuwania są wykonywane dla wszystkich tabel w zestawie danych. |
Bezpieczeństwo
W przypadku używania poleceń danych z właściwością CommandType
ustawioną na Textnależy dokładnie sprawdzić informacje wysyłane z klienta przed przekazaniem ich do bazy danych. Złośliwi użytkownicy mogą próbować wysyłać (wstrzykiwać) zmodyfikowane lub dodatkowe instrukcje SQL w celu uzyskania nieautoryzowanego dostępu do 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 użycie sparametryzowanych zapytań lub procedur składowanych, jeśli jest to możliwe.