Udostępnij za pośrednictwem


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

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:

Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

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.

Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

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 Aktualizacje istniejących rekordów 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);
}