Sdílet prostřednictvím


Vytvoření vazby objektů jako zdrojů dat v aplikacích .NET Framework pomocí sady Visual Studio

Poznámka:

Datové sady a související třídy jsou staršími technologiemi rozhraní .NET Framework z počátku 2000, které aplikacím umožňují pracovat s daty v paměti, zatímco aplikace jsou odpojené od databáze. Tyto technologie jsou zvláště užitečné pro aplikace, které uživatelům umožňují upravovat data a uchovávat změny zpět do databáze. I když se datové sady ukázaly jako velmi úspěšná technologie, doporučujeme, aby nové aplikace .NET používaly Entity Framework Core. Entity Framework poskytuje přirozenější způsob práce s tabulkovými daty jako objektovými modely a má jednodušší programovací rozhraní.

Visual Studio poskytuje nástroje pro návrh a čas pro práci s vlastními objekty jako zdrojem dat ve vaší aplikaci. Pokud chcete ukládat data z databáze v objektu, který svážete s ovládacími prvky uživatelského rozhraní, doporučujeme použít Entity Framework k vygenerování třídy nebo tříd. Entity Framework automaticky vygeneruje všechny často používané kód sledování změn, což znamená, že všechny změny místních objektů se automaticky zachovají do databáze při volání AcceptChanges v objektu DbSet. Další informace najdete v dokumentaci ke službě Entity Framework.

Tip

Přístupy k vazbám objektů v tomto článku by se měly zvážit pouze v případě, že vaše aplikace už je založená na datových sadách. Tyto přístupy můžete použít také v případě, že už znáte datové sady a data, která budete zpracovávat, jsou tabulková a ne příliš složitá nebo příliš velká. Ještě jednodušší příklad zahrnující načtení dat přímo do objektů pomocí třídy DataReader a ruční aktualizaci uživatelského rozhraní bez vazby dat najdete v tématu Vytvoření jednoduché datové aplikace pomocí ADO.NET.

Požadavky na objekty

Jediným požadavkem, aby vlastní objekty fungovaly s nástroji pro návrh dat v sadě Visual Studio, je, že objekt potřebuje alespoň jednu veřejnou vlastnost.

Obecně platí, že vlastní objekty nevyžadují žádná konkrétní rozhraní, konstruktory ani atributy, které by fungovaly jako zdroj dat pro aplikaci. Pokud však chcete objekt přetáhnout z okna Zdroje dat na návrhovou plochu, aby se vytvořil ovládací prvek svázaný s daty a pokud objekt implementuje ITypedList objekt nebo IListSource rozhraní, musí mít objekt výchozí konstruktor. Jinak Visual Studio nemůže vytvořit instanci objektu zdroje dat a při přetažení položky na návrhovou plochu zobrazí chybu.

Příklady použití vlastních objektů jako zdrojů dat

I když existuje mnoho způsobů, jak implementovat logiku aplikace při práci s objekty jako zdrojem dat, pro databáze SQL existuje několik standardních operací, které lze zjednodušit pomocí objektů TableAdapter vygenerovaných sadou Visual Studio. Tato stránka vysvětluje, jak implementovat tyto standardní procesy pomocí objektů TableAdapter. Nejedná se o vodítko pro vytváření vlastních objektů. Obvykle například provedete následující standardní operace bez ohledu na konkrétní implementaci objektů nebo logiky aplikace:

  • Načítání dat do objektů (obvykle z databáze)

  • Vytvoření typové kolekce objektů

  • Přidávání objektů do kolekce a odebírání objektů.

  • Zobrazení dat objektu uživatelům ve formuláři

  • Změna nebo úprava dat v objektu

  • Ukládání dat z objektů zpět do databáze

Načtení dat do objektů

V tomto příkladu načtete data do objektů pomocí objektů TableAdapter. Ve výchozím nastavení jsou objekty TableAdapter vytvořeny dvěma druhy metod, které načítají data z databáze a naplňují tabulky dat.

  • Metoda TableAdapter.Fill vyplní existující tabulku dat vrácenými daty.

  • Metoda TableAdapter.GetData vrátí novou tabulku dat naplněnou daty.

Nejjednodušší způsob, jak načíst vlastní objekty s daty, je volat metodu TableAdapter.GetData , procházet kolekci řádků ve vrácené datové tabulce a naplnit každý objekt hodnotami v každém řádku. Můžete vytvořit metodu GetData , která vrátí vyplněnou tabulku dat pro libovolný dotaz přidaný do tableAdapter.

Poznámka:

Visual Studio pojmenuje dotazy Fill TableAdapter a GetData ve výchozím nastavení je možné tyto názvy změnit na libovolný platný název metody.

Následující příklad ukazuje, jak procházet řádky v tabulce dat a naplnit objekt daty:

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);
    }
}

Vytvoření typové kolekce objektů

Můžete vytvořit třídy kolekce pro vaše objekty nebo použít typové kolekce, které jsou automaticky poskytovány BindingSource komponenta.

Při vytváření vlastní třídy kolekce pro objekty doporučujeme, abyste dědili z BindingList<T>. Tato obecná třída poskytuje funkce pro správu kolekce a také schopnost vyvolat události, které odesílají oznámení do infrastruktury datové vazby v model Windows Forms.

Automaticky vygenerovaná kolekce používá BindingSource BindingList<T> pro svou typovou kolekci. Pokud vaše aplikace nevyžaduje další funkce, můžete v rámci této BindingSourcekolekce udržovat . Další informace naleznete ve List vlastnosti BindingSource třídy.

Poznámka:

Pokud vaše kolekce vyžaduje funkce, které nejsou poskytovány základní implementací BindingList<T>, měli byste vytvořit vlastní kolekci, abyste ji mohli podle potřeby přidat do třídy.

Následující kód ukazuje, jak vytvořit třídu pro kolekci objektů silného Order typu:

/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
    // Add any additional functionality required by your collection.
}

Přidání objektů do kolekce

Objekty přidáte do kolekce voláním Add metody třídy vlastní kolekce nebo .BindingSource

Poznámka:

Metoda Add je automaticky poskytována pro vaši vlastní kolekci při dědění z BindingList<T>.

Následující kód ukazuje, jak přidat objekty do typové kolekce v BindingSource:

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

Následující kód ukazuje, jak přidat objekty do typované kolekce, která dědí z BindingList<T>:

Poznámka:

V tomto příkladu Orders je kolekce vlastností objektu Customer .

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

Odebrání objektů z kolekce

Objekty z kolekce odeberete voláním Remove nebo RemoveAt metodou třídy vlastní kolekce nebo třídy BindingSource.

Poznámka:

Tyto metody jsou automaticky poskytovány Remove pro vaši vlastní kolekci při dědění z BindingList<T>.RemoveAt

Následující kód ukazuje, jak vyhledat a odebrat objekty z typované kolekce v BindingSource RemoveAt metodě:

int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

Zobrazení dat objektů uživatelům

Pokud chcete zobrazit data v objektech uživatelům, vytvořte pomocí průvodce konfigurací zdroje dat zdroj dat a přetáhněte celý objekt nebo jednotlivé vlastnosti do formuláře z okna Zdroje dat.

Úprava dat v objektech

Chcete-li upravit data ve vlastních objektech, které jsou svázané s ovládacími prvky model Windows Forms, jednoduše upravte data v vázaném ovládacím prvku (nebo přímo ve vlastnostech objektu). Architektura datové vazby aktualizuje data v objektu.

Pokud vaše aplikace vyžaduje sledování změn a vrácení navrhovaných změn do původních hodnot, musíte tuto funkci implementovat v objektovém modelu. Příklady, jak tabulky dat sledují navrhované změny, viz DataRowState, HasChangesa GetChanges.

Uložení dat do objektů zpět do databáze

Uložte data zpět do databáze předáním hodnot z objektu do metod DBDirect objektu TableAdapter.

Visual Studio vytvoří metody DBDirect, které lze spouštět přímo s databází. Tyto metody nevyžadují objekty DataSet ani DataTable.

Metoda TableAdapter DBDirect Popis
TableAdapter.Insert Přidá do databáze nové záznamy, které umožňují předávat hodnoty jednotlivých sloupců jako parametry metody.
TableAdapter.Update Aktualizuje existující záznamy v databázi. Metoda Update přebírá původní a nové hodnoty sloupců jako parametry metody. Původní hodnoty slouží k vyhledání původního záznamu a nové hodnoty slouží k aktualizaci tohoto záznamu.

Tato TableAdapter.Update metoda se také používá k odsouhlasení změn v datové sadě zpět do databáze tím, že vezme DataSetjako parametry metody , DataTable, DataRownebo pole DataRows.
TableAdapter.Delete Odstraní existující záznamy z databáze na základě hodnot původního sloupce předaného jako parametry metody.

Pokud chcete uložit data z kolekce objektů, projděte kolekci objektů (například pomocí smyčky for-next). Pomocí metod DBDirect objektu TableAdapter odešlete hodnoty pro každý objekt do databáze.

Následující příklad ukazuje, jak pomocí TableAdapter.Insert metody DBDirect přidat nového zákazníka přímo do databáze:

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);
}