Wiązanie obiektów jako źródeł danych w aplikacjach .NET Framework przy użyciu programu Visual Studio
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.
Program Visual Studio udostępnia narzędzia czasu projektowania do pracy z obiektami niestandardowymi jako źródłem danych w aplikacji. Jeśli chcesz przechowywać dane z bazy danych w obiekcie powiązanym z kontrolkami interfejsu użytkownika, zalecane jest użycie programu Entity Framework do generowania klas lub klas. Program Entity Framework automatycznie generuje cały standardowy kod śledzenia zmian, co oznacza, że wszelkie zmiany obiektów lokalnych są automatycznie utrwalane w bazie danych po wywołaniu metody AcceptChanges w obiekcie DbSet. Aby uzyskać więcej informacji, zobacz Dokumentację programu Entity Framework.
Napiwek
Metody powiązania obiektów w tym artykule powinny być brane pod uwagę tylko wtedy, gdy aplikacja jest już oparta na zestawach danych. Możesz również użyć tych metod, jeśli znasz już zestawy danych, a dane, które będziesz przetwarzać, są tabelaryczne i nie są zbyt złożone lub zbyt duże. Aby uzyskać jeszcze prostszy przykład dotyczący ładowania danych bezpośrednio do obiektów przy użyciu elementu DataReader i ręcznego aktualizowania interfejsu użytkownika bez powiązania danych, zobacz Tworzenie prostej aplikacji danych przy użyciu ADO.NET.
Wymagania dotyczące obiektu
Jedynym wymaganiem dla obiektów niestandardowych do pracy z narzędziami projektowania danych w programie Visual Studio jest to, że obiekt potrzebuje co najmniej jednej właściwości publicznej.
Ogólnie rzecz biorąc, obiekty niestandardowe nie wymagają żadnych określonych interfejsów, konstruktorów ani atrybutów do działania jako źródła danych dla aplikacji. Jeśli jednak chcesz przeciągnąć obiekt z okna Źródła danych do powierzchni projektowej w celu utworzenia kontrolki powiązanej z danymi, a jeśli obiekt implementuje ITypedList interfejs lub IListSource , obiekt musi mieć konstruktor domyślny. W przeciwnym razie program Visual Studio nie może utworzyć wystąpienia obiektu źródła danych i wyświetla błąd podczas przeciągania elementu na powierzchnię projektową.
Przykłady użycia obiektów niestandardowych jako źródeł danych
Chociaż istnieje wiele sposobów implementowania logiki aplikacji podczas pracy z obiektami jako źródłem danych, w przypadku baz danych SQL istnieje kilka standardowych operacji, które można uprościć przy użyciu obiektów TableAdapter wygenerowanych przez program Visual Studio. Na tej stronie wyjaśniono, jak zaimplementować te standardowe procesy przy użyciu elementów TableAdapters. Nie jest ona przeznaczona jako przewodnik tworzenia obiektów niestandardowych. Na przykład zwykle wykonujesz następujące standardowe operacje niezależnie od konkretnej implementacji obiektów lub logiki aplikacji:
Ładowanie danych do obiektów (zazwyczaj z bazy danych).
Tworzenie wpisanej kolekcji obiektów.
Dodawanie obiektów do kolekcji i usuwanie ich z kolekcji.
Wyświetlanie danych obiektu użytkownikom w formularzu.
Zmiana/edytowanie danych w obiekcie.
Zapisywanie danych z obiektów z powrotem do bazy danych.
Ładowanie danych do obiektów
W tym przykładzie dane są ładowane do obiektów przy użyciu obiektów TableAdapters. Domyślnie klasy TableAdapters są tworzone przy użyciu dwóch rodzajów metod, które pobierają dane z bazy danych i wypełniają tabele danych.
Metoda
TableAdapter.Fill
wypełnia istniejącą tabelę danych zwróconymi danymi.Metoda
TableAdapter.GetData
zwraca nową tabelę danych wypełniną danymi.
Najprostszym sposobem załadowania obiektów niestandardowych przy użyciu danych jest wywołanie TableAdapter.GetData
metody , pętla przez kolekcję wierszy w zwracanej tabeli danych i wypełnienie każdego obiektu wartościami w każdym wierszu. Możesz utworzyć metodę zwracającą wypełniona tabelę GetData
danych dla dowolnego zapytania dodanego do tabeli TableAdapter.
Uwaga
Program Visual Studio domyślnie nazywa zapytania Fill
TableAdapter, GetData
ale można zmienić te nazwy na dowolną prawidłową nazwę metody.
W poniższym przykładzie pokazano, jak przechodzić w pętli wierszy w tabeli danych i wypełniać obiekt danymi:
private void LoadCustomers()
{
NorthwindDataSet.CustomersDataTable customerData =
customersTableAdapter1.GetTop5Customers();
foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
{
Customer currentCustomer = new Customer();
currentCustomer.CustomerID = customerRow.CustomerID;
currentCustomer.CompanyName = customerRow.CompanyName;
if (customerRow.IsAddressNull() == false)
{
currentCustomer.Address = customerRow.Address;
}
if (customerRow.IsCityNull() == false)
{
currentCustomer.City = customerRow.City;
}
if (customerRow.IsContactNameNull() == false)
{
currentCustomer.ContactName = customerRow.ContactName;
}
if (customerRow.IsContactTitleNull() == false)
{
currentCustomer.ContactTitle = customerRow.ContactTitle;
}
if (customerRow.IsCountryNull() == false)
{
currentCustomer.Country = customerRow.Country;
}
if (customerRow.IsFaxNull() == false)
{
currentCustomer.Fax = customerRow.Fax;
}
if (customerRow.IsPhoneNull() == false)
{
currentCustomer.Phone = customerRow.Phone;
}
if (customerRow.IsPostalCodeNull() == false)
{
currentCustomer.PostalCode = customerRow.PostalCode;
}
if (customerRow.IsRegionNull() == false)
{
currentCustomer.Region = customerRow.Region;
}
LoadOrders(currentCustomer);
customerBindingSource.Add(currentCustomer);
}
}
Tworzenie wpisanej kolekcji obiektów
Można tworzyć klasy kolekcji dla obiektów lub używać typowanych kolekcji, które są automatycznie udostępniane przez składnik BindingSource.
Podczas tworzenia niestandardowej klasy kolekcji dla obiektów sugerujemy dziedziczenie z BindingList<T>klasy . Ta klasa ogólna udostępnia funkcje administrowania kolekcją, a także możliwość zgłaszania zdarzeń, które wysyłają powiadomienia do infrastruktury powiązania danych w formularzach Windows Forms.
Automatycznie wygenerowana kolekcja w obiekcie BindingSource używa BindingList<T> klasy dla jej typizowanej kolekcji. Jeśli aplikacja nie wymaga dodatkowych funkcji, możesz zachować kolekcję w programie BindingSource. Aby uzyskać więcej informacji, zobacz List właściwość BindingSource klasy.
Uwaga
Jeśli kolekcja wymaga funkcji, które nie są dostarczane przez podstawową implementację BindingList<T>klasy , należy utworzyć kolekcję niestandardową, aby można było dodać do klasy w razie potrzeby.
Poniższy kod pokazuje, jak utworzyć klasę dla silnie typizowanej Order
kolekcji obiektów:
/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
// Add any additional functionality required by your collection.
}
Dodawanie obiektów do kolekcji
Obiekty są dodawane do kolekcji przez wywołanie Add
metody niestandardowej klasy kolekcji lub klasy BindingSource.
Uwaga
Metoda Add
jest automatycznie udostępniana dla kolekcji niestandardowej po dziedziczeniu z BindingList<T>klasy .
Poniższy kod pokazuje, jak dodać obiekty do wpisanej kolekcji w obiekcie BindingSource:
Poniższy kod pokazuje, jak dodać obiekty do kolekcji typizowanej, która dziedziczy z BindingList<T>klasy :
Uwaga
W tym przykładzie Orders
kolekcja jest właściwością Customer
obiektu.
Usuwanie obiektów z kolekcji
Obiekty są usuwane z kolekcji przez wywołanie Remove
metody lub RemoveAt
klasy kolekcji niestandardowej lub BindingSourceklasy .
Uwaga
Metody Remove
i RemoveAt
są automatycznie udostępniane dla kolekcji niestandardowej po dziedziczeniu z BindingList<T>klasy .
Poniższy kod przedstawia sposób lokalizowania i usuwania obiektów z kolekcji typizowanej w BindingSource metodzie RemoveAt :
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);
Wyświetlanie danych obiektów dla użytkowników
Aby wyświetlić dane w obiektach dla użytkowników, utwórz źródło danych obiektu za pomocą kreatora Konfiguracja źródła danych, a następnie przeciągnij cały obiekt lub poszczególne właściwości do formularza z okna Źródła danych.
Modyfikowanie danych w obiektach
Aby edytować dane w obiektach niestandardowych powiązanych z kontrolkami formularzy systemu Windows, po prostu edytuj dane w powiązanej kontrolce (lub bezpośrednio we właściwościach obiektu). Architektura powiązania danych aktualizuje dane w obiekcie.
Jeśli aplikacja wymaga śledzenia zmian i wycofywania proponowanych zmian w ich oryginalnych wartościach, musisz zaimplementować tę funkcję w modelu obiektów. Przykłady sposobu śledzenia proponowanych zmian w tabelach danych można znaleźć w temacie DataRowState, HasChangesi GetChanges.
Zapisywanie danych w obiektach z powrotem do bazy danych
Zapisz dane z powrotem w bazie danych, przekazując wartości z obiektu do metod DBDirect obiektu TableAdapter.
Program Visual Studio tworzy metody DBDirect, które można wykonywać bezpośrednio w bazie danych. Te metody nie wymagają obiektów DataSet ani DataTable.
TableAdapter DBDirect, metoda | opis |
---|---|
TableAdapter.Insert |
Dodaje nowe rekordy do bazy danych, umożliwiając przekazywanie poszczególnych wartości kolumn jako parametrów metody. |
TableAdapter.Update |
Aktualizuje istniejące rekordy w bazie danych. Metoda Update przyjmuje oryginalne i nowe wartości kolumn jako parametry metody. Oryginalne wartości są używane do lokalizowania oryginalnego rekordu, a nowe wartości są używane do aktualizowania tego rekordu. Metoda TableAdapter.Update jest również używana do uzgadniania zmian w zestawie danych z powrotem do bazy danych przez pobranie DataSettablicy DataRow, DataTable, DataRowlub s jako parametrów metody. |
TableAdapter.Delete |
Usuwa istniejące rekordy z bazy danych na podstawie oryginalnych wartości kolumn przekazanych jako parametry metody. |
Aby zapisać dane z kolekcji obiektów, wykonaj pętlę przez kolekcję obiektów (na przykład przy użyciu pętli for-next). Wyślij wartości dla każdego obiektu do bazy danych przy użyciu metod DBDirect usługi TableAdapter.
W poniższym przykładzie pokazano, jak za pomocą TableAdapter.Insert
metody DBDirect dodać nowego klienta bezpośrednio do bazy danych:
private void AddNewCustomers(Customer currentCustomer)
{
customersTableAdapter.Insert(
currentCustomer.CustomerID,
currentCustomer.CompanyName,
currentCustomer.ContactName,
currentCustomer.ContactTitle,
currentCustomer.Address,
currentCustomer.City,
currentCustomer.Region,
currentCustomer.PostalCode,
currentCustomer.Country,
currentCustomer.Phone,
currentCustomer.Fax);
}