Sdílet prostřednictvím


Vytvoření vrstvy přístupu k datům (VB)

Scott Mitchell

Stáhnout PDF

V tomto kurzu začneme od samého začátku a vytvoříme vrstvu přístupu k datům (DAL) pomocí typed DataSets pro přístup k informacím v databázi.

Úvod

Jako vývojáři webu se naše životy týkají práce s daty. Vytváříme databáze pro ukládání dat, kódu pro jejich načtení a úpravu a webových stránek, které je budou shromažďovat a sumarizovat. Toto je první kurz dlouhé série, který prozkoumá techniky pro implementaci těchto běžných vzorů v ASP.NET 2.0. Začneme vytvořením softwarové architektury složené z vrstvy DAL (Data Access Layer) pomocí typed DataSets, BLL (Business Logic Layer), která vynucuje vlastní obchodní pravidla, a prezentační vrstvu složenou z ASP.NET stránek, které sdílejí společné rozložení stránky. Po vytvoření této back-endové práce přejdeme do vytváření sestav, ukážeme si, jak zobrazit, shrnout, shromažďovat a ověřovat data z webové aplikace. Tyto kurzy jsou zaměřené na stručné a poskytují podrobné pokyny s mnoha snímky obrazovky, které vás provedou vizuálně procesem. Každý kurz je k dispozici ve verzích C# a Visual Basic a zahrnuje stažení celého použitého kódu. (Tento první kurz je poměrně zdlouhavý, ale zbytek se prezentuje v mnohem čitelnějších blocích.)

V těchto kurzech budeme používat verzi Microsoft SQL Serveru 2005 Express Edition databáze Northwind umístěné v App_Data adresáři. Kromě souboru App_Data databáze obsahuje složka také skripty SQL pro vytvoření databáze pro případ, že chcete použít jinou verzi databáze. Pokud používáte jinou verzi SQL Serveru databáze Northwind, budete muset aktualizovat NORTHWNDConnectionString nastavení v souboru aplikace Web.config . Webová aplikace byla vytvořena pomocí sady Visual Studio 2005 Professional Edition jako projektu webu založeného na systému souborů. Všechny kurzy ale budou fungovat stejně dobře s bezplatnou verzí sady Visual Studio 2005, Visual Web Developer.

V tomto kurzu začneme od samého začátku a vytvoříme vrstvu přístupu k datům (DAL), po které v druhém kurzu vytvoříme vrstvu obchodní logiky (BLL) a budeme pracovat na rozložení stránky a navigaci ve třetí části. Kurzy po třetí se budou stavět na základech stanovených v prvních třech. V tomto prvním kurzu toho máme hodně na pokrytí, takže zahajte Visual Studio a pojďme začít!

Krok 1: Vytvoření webového projektu a připojení k databázi

Než budeme moct vytvořit vrstvu přístupu k datům (DAL), musíme nejprve vytvořit web a nastavit databázi. Začněte vytvořením nového webu založeného na systému souborů ASP.NET. Provedete to tak, že přejdete do nabídky Soubor a zvolíte Nový web a zobrazí se dialogové okno Nový web. Zvolte šablonu webu ASP.NET, nastavte rozevírací seznam Umístění na Systém souborů, zvolte složku pro umístění webu a nastavte jazyk na Visual Basic.

Vytvoření nového webu založeného na systému souborů

Obrázek 1: Vytvoření nového webu založeného na systému souborů (kliknutím zobrazíte obrázek s plnou velikostí)

Tím se vytvoří nový web se stránkou Default.aspx ASP.NET, složkou App_Data a souborem Web.config .

Po vytvoření webu je dalším krokem přidání odkazu na databázi v Průzkumníku serveru sady Visual Studio. Přidáním databáze do Průzkumníka serveru můžete v sadě Visual Studio přidávat tabulky, uložené procedury, zobrazení atd. Data tabulky můžete také zobrazit nebo vytvořit vlastní dotazy ručně nebo graficky prostřednictvím Tvůrce dotazů. Kromě toho když sestavíme datové sady typed pro DAL, budeme muset visual Studio nasměrovat na databázi, ze které by se měly vytvořit datové sady Typed. I když můžeme poskytnout tyto informace o připojení v tomto okamžiku, Sada Visual Studio automaticky naplní rozevírací seznam databází, které jsou již zaregistrované v Průzkumníku serveru.

Postup přidání databáze Northwind do Průzkumníka serveru závisí na tom, jestli chcete použít databázi SQL Serveru 2005 Express Edition ve App_Data složce nebo pokud máte nastavení databázového serveru Microsoft SQL Server 2000 nebo 2005, který chcete použít.

Použití databáze veApp_Datasložce

Pokud nemáte k připojení databázový server SQL Server 2000 nebo 2005 nebo chcete se jednoduše vyhnout přidání databáze na databázový server, můžete použít verzi SQL Serveru 2005 Express Edition databáze Northwind, která se nachází ve složce staženého webu App_Data (NORTHWND.MDF).

Databáze umístěná App_Data ve složce se automaticky přidá do Průzkumníka serveru. Za předpokladu, že máte na počítači nainstalovaný SQL Server 2005 Express Edition, měl by se zobrazit uzel s názvem NORTHWND. MDF v Průzkumníku serveru, který můžete rozbalit a prozkoumat jeho tabulky, zobrazení, uloženou proceduru atd. (viz obrázek 2).

Složka App_Data může obsahovat také soubory Microsoft Accessu .mdb , které se jako jejich protějšky SQL Serveru automaticky přidají do Průzkumníka serveru. Pokud nechcete používat žádnou z možností SQL Serveru, můžete vždy nainstalovat databázi a aplikace Northwind Traders a umístit je App_Data do adresáře. Mějte ale na paměti, že accessové databáze nejsou tak bohaté na funkce jako SQL Server a nejsou navržené tak, aby se používaly ve scénářích webu. Kromě toho několik kurzů s 35+ využívá určité funkce na úrovni databáze, které Access nepodporuje.

Připojení k databázi na databázovém serveru Microsoft SQL Server 2000 nebo 2005

Případně se můžete připojit k databázi Northwind nainstalované na databázovém serveru. Pokud databázový server ještě nemá nainstalovanou databázi Northwind, musíte ji nejprve přidat do databázového serveru spuštěním instalačního skriptu, který je součástí stahování tohoto kurzu.

Jakmile máte databázi nainstalovanou, přejděte v sadě Visual Studio do Průzkumníka serveru, klikněte pravým tlačítkem na uzel Datové připojení a zvolte Přidat připojení. Pokud průzkumníka serveru nevidíte, přejděte do zobrazení nebo Průzkumníka serveru nebo stiskněte Kombinaci kláves Ctrl+Alt+S. Tím se zobrazí dialogové okno Přidat připojení, kde můžete zadat server, ke kterému se má připojit, ověřovací informace a název databáze. Jakmile úspěšně nakonfigurujete informace o připojení k databázi a kliknete na tlačítko OK, databáze se přidá jako uzel pod uzlem Datové připojení. Uzel databáze můžete rozšířit a prozkoumat jeho tabulky, zobrazení, uložené procedury atd.

Přidání připojení k databázi Northwind vašeho databázového serveru

Obrázek 2: Přidání připojení k databázi Northwind vašeho databázového serveru

Krok 2: Vytvoření vrstvy přístupu k datům

Při práci s daty je jednou z možností vložit logiku specifickou pro data přímo do prezentační vrstvy (ve webové aplikaci tvoří ASP.NET stránky prezentační vrstvu). To může mít formu psaní ADO.NET kódu v části kódu stránky ASP.NET nebo pomocí ovládacího prvku SqlDataSource z revizní části. V obou případech tento přístup úzce páruje logiku přístupu k datům s prezentační vrstvou. Doporučeným přístupem je ale oddělit logiku přístupu k datům od prezentační vrstvy. Tato samostatná vrstva se označuje jako vrstva přístupu k datům, zkratka DAL a obvykle se implementuje jako samostatný projekt knihovny tříd. Výhody této vrstvené architektury jsou dobře zdokumentované (viz část Další čtení na konci tohoto kurzu, kde najdete informace o těchto výhodách) a je to přístup, který v této sérii použijeme.

Veškerý kód, který je specifický pro podkladový zdroj dat, například vytvoření připojení k databázi, vydávání SELECT, INSERTUPDATE, a DELETE příkazů atd., by se měl nacházet v DAL. Prezentační vrstva by neměla obsahovat žádné odkazy na takový kód pro přístup k datům, ale měla by místo toho provádět volání do DAL pro jakékoli a všechny žádosti o data. Vrstvy přístupu k datům obvykle obsahují metody pro přístup k podkladovým databázovým datům. Například databáze Northwind má Products a Categories tabulky, které zaznamenávají produkty k prodeji a kategorie, do kterých patří. V naší DAL budeme mít metody jako:

  • GetCategories(), která vrátí informace o všech kategoriích.
  • GetProducts(), který vrátí informace o všech produktech
  • GetProductsByCategoryID(categoryID), který vrátí všechny produkty, které patří do zadané kategorie
  • GetProductByProductID(productID), který vrátí informace o konkrétním produktu

Tyto metody se při vyvolání připojí k databázi, vydá příslušný dotaz a vrátí výsledky. Jak tyto výsledky vrátíme, je důležité. Tyto metody mohou jednoduše vrátit DataSet nebo DataReader naplněné databázovým dotazem, ale v ideálním případě by tyto výsledky měly být vráceny pomocí objektů silného typu. Objekt silného typu je objekt, jehož schéma je pevně definováno v době kompilace, zatímco opačný, volně typovaný objekt, je jeden, jehož schéma není známo, dokud modul runtime.

Například DataReader a DataSet (ve výchozím nastavení) jsou volně typované objekty, protože jejich schéma je definováno sloupci vrácenými databázovým dotazem použitým k naplnění. Pro přístup ke konkrétnímu sloupci z volně napsané tabulky DataTable musíme použít syntaxi jako: DataTable.Rows(index)("columnName"). Volný typ DataTable v tomto příkladu je vystaven skutečností, že potřebujeme získat přístup k názvu sloupce pomocí řetězcového nebo pořadového indexu. DataTable silného typu na druhé straně bude mít každý z jeho sloupců implementovaný jako vlastnosti, což vede k kódu, který vypadá takto: DataTable.Rows(index).columnName.

Pokud chcete vrátit objekty se silnými typy, můžou vývojáři buď vytvořit vlastní obchodní objekty, nebo použít typové datové sady. Obchodní objekt je implementován vývojářem jako třída, jejíž vlastnosti obvykle odrážejí sloupce podkladové databázové tabulky, kterou obchodní objekt představuje. Typed DataSet je třída vygenerovaná sadou Visual Studio na základě schématu databáze a jejich členy jsou silně typovány podle tohoto schématu. Typová datová sada se skládá z tříd, které rozšiřují ADO.NET DataSet, DataTable a DataRow třídy. Kromě tabulek DataTables se silnými typy teď obsahují také objekty TableAdapter, což jsou třídy s metodami pro naplnění datových tabulek DataSet a šíření úprav v rámci DataTables zpět do databáze.

Poznámka:

Další informace o výhodách a nevýhodách použití typed DataSets oproti vlastním obchodním objektům najdete v tématu Návrh komponent datové vrstvy a předávání datových vrstev.

Pro architekturu těchto kurzů použijeme datové sady se silnými typy. Obrázek 3 znázorňuje pracovní postup mezi různými vrstvami aplikace, které používají typové datové sady.

Veškerý kód pro přístup k datům se přeleguje do DAL.

Obrázek 3: Veškerý kód pro přístup k datům je přelegován na dal (kliknutím zobrazíte obrázek plné velikosti)

Vytvoření typové datové sady a adaptéru tabulky

Začneme tím, že do projektu přidáme typovou datovou sadu. Chcete-li toho dosáhnout, klikněte pravým tlačítkem myši na uzel projektu v Průzkumník řešení a zvolte Přidat novou položku. V seznamu šablon vyberte možnost DataSet a pojmenujte ji Northwind.xsd.

Volba přidání nové datové sady do projektu

Obrázek 4: Volba přidání nové datové sady do projektu (kliknutím zobrazíte obrázek s plnou velikostí)

Po kliknutí na Přidat po zobrazení výzvy k přidání datové sady do App_Code složky zvolte Ano. Zobrazí se Návrhář pro Typová datová sada a spustí se Průvodce konfigurací TableAdapter, který umožňuje přidat první TableAdapter do typové datové sady.

Typová datová sada slouží jako kolekce dat silného typu; skládá se z instancí DataTable silného typu, z nichž každá se zase skládá ze silně typed DataRow instancí. Vytvoříme datovou tabulku silného typu pro každou z podkladových databázových tabulek, se kterou musíme pracovat v této sérii kurzů. Začněme vytvořením tabulky DataTable Products .

Mějte na paměti, že datové tabulky se silnými typy neobsahují žádné informace o přístupu k datům z podkladové databázové tabulky. Abychom mohli načíst data k naplnění tabulky DataTable, používáme třídu TableAdapter, která funguje jako vrstva přístupu k datům. V případě tabulky Products DataTable bude Objekt TableAdapter obsahovat metody GetProducts(), GetProductByCategoryID(categoryID)a tak dále, které vyvoláme z prezentační vrstvy. Role DataTable slouží jako objekty silného typu používané k předávání dat mezi vrstvami.

Průvodce konfigurací TableAdapter začíná výzvou k výběru databáze, se kterou chcete pracovat. V rozevíracím seznamu se tyto databáze zobrazují v Průzkumníku serveru. Pokud jste databázi Northwind nepřidali do Průzkumníka serveru, můžete to provést kliknutím na tlačítko Nové připojení.

V rozevíracím seznamu zvolte databázi Northwind.

Obrázek 5: Volba databáze Northwind z rozevíracího seznamu (kliknutím zobrazíte obrázek v plné velikosti)

Po výběru databáze a kliknutí na Další se zobrazí dotaz, jestli chcete uložit připojovací řetězec do Web.config souboru. Uložením připojovací řetězec nebudete mít pevně zakódované třídy TableAdapter, což zjednodušuje věci, pokud se připojovací řetězec informace v budoucnu změní. Pokud se rozhodnete uložit připojovací řetězec do konfiguračního souboru, který je umístěný v oddílu<connectionStrings>, který můžete volitelně zašifrovat pro lepší zabezpečení nebo upravit později prostřednictvím nové stránky vlastností ASP.NET 2.0 v nástroji pro správu grafického uživatelského rozhraní služby IIS, což je vhodnější pro správce.

Uložení připojovacího řetězce do souboru Web.config

Obrázek 6: Uložení připojovacího řetězce do Web.config (kliknutím zobrazíte obrázek s plnou velikostí)

Dále musíme definovat schéma pro první datovou tabulku se silnými typy a poskytnout první metodu pro objekt TableAdapter, který se má použít při naplnění datové sady se silnými typy. Tyto dva kroky se provádějí současně vytvořením dotazu, který vrátí sloupce z tabulky, kterou chceme promítnout do tabulky DataTable. Na konci průvodce dáme tomuto dotazu název metody. Po dosažení této metody je možné tuto metodu vyvolat z naší prezentační vrstvy. Metoda spustí definovaný dotaz a naplní tabulku DataTable se silnými typy.

Abychom mohli začít definovat dotaz SQL, musíme nejprve indikovat, jak má tableAdapter vydat dotaz. Můžeme použít příkaz SQL ad hoc, vytvořit novou uloženou proceduru nebo použít existující uloženou proceduru. V těchto kurzech použijeme ad hoc příkazy SQL.

Dotazování dat pomocí příkazu AD-Hoc SQL

Obrázek 7: Dotazování dat pomocí příkazu AD Hoc SQL (kliknutím zobrazíte obrázek s plnou velikostí)

V tuto chvíli můžeme zadat dotaz SQL ručně. Při vytváření první metody v Objektu TableAdapter obvykle chcete, aby dotaz vrátil ty sloupce, které musí být vyjádřeny v odpovídající DataTable. Toho můžeme dosáhnout vytvořením dotazu, který vrátí všechny sloupce a všechny řádky z Products tabulky:

Do textového pole zadejte dotaz SQL.

Obrázek 8: Zadání dotazu SQL do textového pole (kliknutím zobrazíte obrázek v plné velikosti)

Případně můžete použít Tvůrce dotazů a graficky sestavit dotaz, jak je znázorněno na obrázku 9.

Vytvoření dotazu graficky prostřednictvím Editor Power Query

Obrázek 9: Vytvoření dotazu graficky prostřednictvím Editor Power Query (kliknutím zobrazíte obrázek v plné velikosti)

Po vytvoření dotazu, ale před přechodem na další obrazovku klikněte na tlačítko Upřesnit možnosti. V projektech webů je jedinou rozšířenou možností vybranou ve výchozím nastavení příkaz Generovat příkaz Vložit, Aktualizovat a Delete; Pokud spustíte tohoto průvodce z knihovny tříd nebo projektu systému Windows, vybere se také možnost Použít optimistickou souběžnost. Prozatím nechte zaškrtnuté políčko Použít optimistickou souběžnost. V budoucích kurzech prozkoumáme optimistickou souběžnost.

Select Only the Generate Insert, Update, and Delete statements Option

Obrázek 10: Vyberte možnost Generovat pouze příkazy Vložit, Aktualizovat a Odstranit (kliknutím zobrazíte obrázek v plné velikosti).

Po ověření upřesňujících možností pokračujte kliknutím na další obrazovku. Zde jsme požádáni, abychom vybrali, které metody se mají přidat do objektu TableAdapter. Pro naplnění dat existují dva vzory:

  • Vyplňte tabulku DataTable tímto přístupem metodou, která přebírá dataTable jako parametr a naplní ji na základě výsledků dotazu. ADO.NET DataAdapter třída, například implementuje tento vzor s jeho Fill() metodou.
  • Vrátí dataTable tímto přístupem metoda vytvoří a vyplní dataTable za vás a vrátí ji jako návratovou hodnotu metod.

TableAdapter může implementovat jeden nebo oba tyto vzory. Zde uvedené metody můžete také přejmenovat. Ponecháme obě políčka zaškrtnutá, i když v těchto kurzech budeme používat pouze druhý vzor. Přejmenujme také spíše obecnou GetData metodu na GetProducts.

Pokud je zaškrtnuté, konečné zaškrtávací políčko GenerateDBDirectMethods, vytvoří Insert()Update(), a Delete() metody pro TableAdapter. Pokud tuto možnost ponecháte nezaškrtnutou, bude nutné všechny aktualizace provést pouze pomocí jediné Update() metody TableAdapter, která přebírá Typová datová sada, DataTable, jeden DataRow nebo pole DataRows. (Pokud jste nezaškrtli políčko Generovat příkazy Vložit, Aktualizovat a Odstranit z upřesňujících vlastností na obrázku 9, nastavení tohoto zaškrtávacího políčka nebude mít žádný vliv.) Toto políčko ponecháme zaškrtnuté.

Změna názvu metody z GetData na GetProducts

Obrázek 11: Změna názvu metody z GetData na GetProducts (kliknutím zobrazíte obrázek s plnou velikostí)

Dokončete průvodce kliknutím na Dokončit. Po zavření průvodce se vrátíme do Návrháře datových sad, který zobrazuje tabulku DataTable, kterou jsme právě vytvořili. Seznam sloupců můžete zobrazit v tabulce Products DataTable (ProductID, ProductNamea tak dále), stejně jako metody ProductsTableAdapter (Fill() a GetProducts()).

DataTable Products a ProductsTableAdapter byly přidány do typové datové sady.

Obrázek 12: Products Tabulka DataTable a ProductsTableAdapter byla přidána do typové datové sady (kliknutím zobrazíte obrázek s plnou velikostí)

V tomto okamžiku máme Datovou sadu typu s jednou DataTable (Northwind.Products) a třídy DataAdapter silného typu (NorthwindTableAdapters.ProductsTableAdapter) s metodou GetProducts() . Tyto objekty lze použít pro přístup k seznamu všech produktů z kódu, například:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products as Northwind.ProductsDataTable
products = productsAdapter.GetProducts()
For Each productRow As Northwind.ProductsRow In products
    Response.Write("Product: " & productRow.ProductName & "<br />")
Next

Tento kód nepožadoval, abychom napsali jeden bit kódu specifického pro přístup k datům. Nemuseli jsme vytvořit instanci žádné třídy ADO.NET, nemuseli jsme odkazovat na žádné připojovací řetězec, dotazy SQL ani uložené procedury. Místo toho poskytuje TableAdapter kód přístupu k datům nízké úrovně.

Každý objekt použitý v tomto příkladu je také silně napsaný a umožňuje sadě Visual Studio poskytovat intelliSense a kontrolu typů kompilace. A nejlepší ze všech datových tabulek vrácených Objekty TableAdapter mohou být vázány na ASP.NET webové ovládací prvky, jako jsou GridView, DetailsView, DropDownList, CheckBoxList a několik dalších. Následující příklad znázorňuje vazbu DataTable vrácenou metodou GetProducts() na GridView pouze skenované tři řádky kódu v rámci obslužné rutiny Page_Load události.

AllProducts.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="AllProducts.aspx.vb"
    Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>View All Products in a GridView</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            All Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

AllProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class AllProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource = productsAdapter.GetProducts()
        GridView1.DataBind()
    End Sub
End Class

Seznam produktů se zobrazí v objektu GridView.

Obrázek 13: Seznam produktů se zobrazí v objektu GridView (kliknutím zobrazíte obrázek v plné velikosti).

I když tento příklad vyžadoval, abychom do obslužné rutiny události stránky Page_Load ASP.NET napsali tři řádky kódu, v budoucích kurzech prozkoumáme, jak pomocí ObjectDataSource deklarativní načtení dat z DAL. S ObjectDataSource nebudeme muset napsat žádný kód a získáme také podporu stránkování a řazení!

Krok 3: Přidání parametrizovaných metod do vrstvy přístupu k datům

V tuto chvíli má naše ProductsTableAdapter třída ale jednu metodu, GetProducts()která vrací všechny produkty v databázi. I když je schopnost pracovat se všemi produkty, je určitě užitečné, existují chvíle, kdy budeme chtít načíst informace o konkrétním produktu nebo všechny produkty, které patří do konkrétní kategorie. Abychom mohli tyto funkce přidat do vrstvy přístupu k datům, můžeme do objektu TableAdapter přidat parametrizované metody.

Pojďme přidat metodu GetProductsByCategoryID(categoryID) . Pokud chcete do DAL přidat novou metodu, vraťte se do Návrháře datové sady, klikněte pravým tlačítkem myši v ProductsTableAdapter části a zvolte Přidat dotaz.

Klikněte pravým tlačítkem myši na tableAdapter a zvolte Přidat dotaz.

Obrázek 14: Klikněte pravým tlačítkem myši na tableAdapter a zvolte Přidat dotaz.

Nejdřív se zobrazí výzva, jestli chceme získat přístup k databázi pomocí ad hoc příkazu SQL nebo nové nebo existující uložené procedury. Pojďme se znovu rozhodnout použít příkaz SQL ad hoc. Dále se zobrazí dotaz, jaký typ dotazu SQL chceme použít. Vzhledem k tomu, že chceme vrátit všechny produkty, které patří do zadané kategorie, chceme napsat SELECT příkaz, který vrací řádky.

Volba vytvoření příkazu SELECT, který vrací řádky

Obrázek 15: Volba vytvoření SELECT příkazu, který vrátí řádky (kliknutím zobrazíte obrázek s plnou velikostí)

Dalším krokem je definování dotazu SQL použitého pro přístup k datům. Vzhledem k tomu, že chceme vrátit pouze ty produkty, které patří do určité kategorie, používám stejný SELECT výrok od GetProducts(), ale přidejte následující WHERE klauzuli: WHERE CategoryID = @CategoryID. Parametr @CategoryID označuje průvodce TableAdapter, že metoda, kterou vytváříme, bude vyžadovat vstupní parametr odpovídajícího typu (konkrétně celé číslo s možnou hodnotou null).

Zadejte dotaz, který vrátí pouze produkty v zadané kategorii.

Obrázek 16: Zadání dotazu pouze pro vrácení produktů v zadané kategorii (kliknutím zobrazíte obrázek s plnou velikostí)

V posledním kroku můžeme zvolit, které vzory přístupu k datům se mají použít, a také přizpůsobit názvy vygenerovaných metod. V případě vzoru Fill změníme název na FillByCategoryID návratový vzor tabulky DataTable (metody GetX ), použijeme GetProductsByCategoryID.

Volba názvů pro metody TableAdapter

Obrázek 17: Volba názvů metod TableAdapter (kliknutím zobrazíte obrázek s plnou velikostí)

Po dokončení průvodce obsahuje Návrhář datové sady nové metody TableAdapter.

Produkty se teď dají dotazovat podle kategorie.

Obrázek 18: Produkty se teď dají dotazovat podle kategorie

Chvilku si přidejte metodu GetProductByProductID(productID) pomocí stejné techniky.

Tyto parametrizované dotazy je možné testovat přímo z Návrháře datové sady. Klikněte pravým tlačítkem myši na metodu v tabulce TableAdapter a zvolte Náhled dat. Dále zadejte hodnoty, které chcete použít pro parametry, a klikněte na Náhled.

Zobrazí se tyto produkty patřící do kategorie nápoje.

Obrázek 19: Tyto produkty patřící do kategorie Nápoje jsou zobrazeny (kliknutím zobrazíte obrázek plné velikosti)

S metodou GetProductsByCategoryID(categoryID) v naší DAL teď můžeme vytvořit ASP.NET stránku, která zobrazuje pouze produkty v zadané kategorii. Následující příklad ukazuje všechny produkty, které jsou v kategorii Nápoje, které mají CategoryID 1.

Beverages.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Beverages.aspx.vb"
    Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>Beverages</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

Beverages.aspx.vb

Imports NorthwindTableAdapters
Partial Class Beverages
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource =
         productsAdapter.GetProductsByCategoryID(1)
        GridView1.DataBind()
    End Sub
End Class

Tyto produkty v kategorii Nápoje jsou zobrazeny

Obrázek 20: Tyto produkty v kategorii Nápoje se zobrazí (kliknutím zobrazíte obrázek v plné velikosti).

Krok 4: Vložení, aktualizace a odstranění dat

Existují dva vzory, které se běžně používají k vkládání, aktualizaci a odstraňování dat. První vzor, který zavolám přímý vzor databáze, zahrnuje vytvoření metod, které při vyvolání, vydání INSERTUPDATE, nebo DELETE příkaz databáze, která pracuje s jedním záznamem databáze. Tyto metody se obvykle předávají v řadě skalárních hodnot (celá čísla, řetězce, logické hodnoty, DateTimes atd.), které odpovídají hodnotám pro vložení, aktualizaci nebo odstranění. Například s tímto vzorem Products pro tabulku by metoda delete převzala celočíselnou parametr označující ProductID záznam k odstranění, zatímco metoda insert vezme řetězec pro ProductName, desetinné číslo UnitPricepro UnitsOnStocka tak dále.

Každá žádost o vložení, aktualizaci a odstranění se okamžitě odešle do databáze.

Obrázek 21: Každá žádost o vložení, aktualizaci a odstranění se odešle do databáze okamžitě (kliknutím zobrazíte obrázek v plné velikosti).

Dalším vzorem, který budu označovat jako vzor dávkové aktualizace, je aktualizace celé datové sady, DataTable nebo kolekce DataRows v jednom volání metody. S tímto vzorem vývojář odstraní, vloží a upraví DataRows v DataTable a pak tyto DataRows nebo DataTable předá do metody update. Tato metoda pak vyčíslí dataRows předané, určuje, zda byly změněny, přidány nebo odstraněny (prostřednictvím hodnoty vlastnosti RowState dataRow) a vydává odpovídající požadavek databáze pro každý záznam.

Všechny změny jsou synchronizovány s databází při vyvolání metody Update

Obrázek 22: Všechny změny se synchronizují s databází při vyvolání metody aktualizace (kliknutím zobrazíte obrázek plné velikosti).

Objekt TableAdapter ve výchozím nastavení používá vzor dávkové aktualizace, ale podporuje také přímý vzor databáze. Vzhledem k tomu, že jsme při vytváření objektu TableAdapter vybrali možnost Generovat příkazy Insert, Update a Delete z rozšířených vlastností, ProductsTableAdapter obsahuje metodu Update() , která implementuje vzor dávkové aktualizace. Konkrétně TableAdapter obsahuje metodu Update() , která může být předána Typed DataSet, silně typ DataTable nebo jeden nebo více DataRows. Pokud jste při prvním vytvoření objektu TableAdapter nechali políčko GenerateDBDirectMethods zaškrtnuté, bude také implementováno prostřednictvím Insert()Update(), a Delete() metod.

Oba vzory úprav dat používají objekty TableAdapter InsertCommandUpdateCommanda DeleteCommand vlastnosti k vydání jejich INSERT, UPDATEa DELETE příkazy do databáze. Kliknutím na objekt TableAdapter v Návrháři datové sady a následným přechodem na okno Vlastnosti můžete zkontrolovat a upravit InsertCommandUpdateCommandDeleteCommand vlastnosti . (Ujistěte se, že jste vybrali objekt TableAdapter a že ProductsTableAdapter je objekt vybraný v rozevíracím seznamu v okno Vlastnosti.)

Objekt TableAdapter má vlastnosti InsertCommand, UpdateCommand a DeleteCommand.

Obrázek 23: Objekt TableAdapter má InsertCommanda UpdateCommandDeleteCommand vlastnosti (kliknutím zobrazíte obrázek s plnou velikostí)

Chcete-li prozkoumat nebo upravit některé z těchto vlastností příkazu databáze, klikněte na CommandText dílčí vlastnost, která zobrazí Tvůrce dotazů.

Konfigurace příkazů INSERT, UPDATE a DELETE v Tvůrci dotazů

Obrázek 24: Konfigurace příkazů a < UPDATEa0/INSERT> DELETE v Tvůrci dotazů (kliknutím zobrazíte obrázek v plné velikosti)

Následující příklad kódu ukazuje, jak pomocí vzoru dávkové aktualizace zdvojnásobit cenu všech produktů, které nejsou ukončeny a které mají 25 jednotek skladem nebo méně:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products As Northwind.ProductsDataTable = productsAdapter.GetProducts()
For Each product As Northwind.ProductsRow In products
   If Not product.Discontinued AndAlso product.UnitsInStock <= 25 Then
      product.UnitPrice *= 2
   End if
Next
productsAdapter.Update(products)

Následující kód ukazuje, jak pomocí modelu přímé databáze programově odstranit konkrétní produkt, pak ho aktualizovat a pak přidat nový:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
productsAdapter.Delete(3)
productsAdapter.Update( _
    "Chai", 1, 1, "10 boxes x 20 bags", 18.0, 39, 15, 10, false, 1)
productsAdapter.Insert( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 15, 0, 10, false)

Vytváření vlastních metod vložení, aktualizace a odstranění

Insert(), Update()a Delete() metody vytvořené přímou metodou DB mohou být trochu těžkopádné, zejména pro tabulky s mnoha sloupci. Když se podíváte na předchozí příklad kódu, bez intellisense to nepomůže, není zvlášť jasné, které Products sloupce tabulky se mapují na každý vstupní parametr a Insert() Update() metody. Někdy může docházet k tomu, že chceme aktualizovat pouze jeden sloupec nebo dva sloupce nebo chtít přizpůsobenou Insert() metodu, která například vrátí hodnotu pole nově vloženého záznamu IDENTITY (automatické zvýšení).

Pokud chcete vytvořit takovou vlastní metodu, vraťte se do Návrháře datové sady. Klikněte pravým tlačítkem myši na TableAdapter a zvolte Přidat dotaz a vraťte se do průvodce TableAdapter. Na druhé obrazovce můžeme označit typ dotazu, který se má vytvořit. Pojďme vytvořit metodu, která přidá nový produkt a pak vrátí hodnotu nově přidaného záznamu ProductID. Proto se můžete rozhodnout vytvořit INSERT dotaz.

Vytvoření metody pro přidání nového řádku do tabulky Products

Obrázek 25: Vytvoření metody pro přidání nového řádku do Products tabulky (kliknutím zobrazíte obrázek s plnou velikostí)

Na další obrazovce se InsertCommandCommandText zobrazí obrazovka. Rozšiřte tento dotaz přidáním SELECT SCOPE_IDENTITY() na konec dotazu, který vrátí poslední hodnotu identity vloženou do IDENTITY sloupce ve stejném oboru. (Další informace o SCOPE_IDENTITY() @@IDENTITY najdete v technické dokumentaci a o tom, proč pravděpodobně chcete používat SCOPE_IDENTITY().) Před přidáním SELECT příkazu nezapomeňte příkaz ukončit INSERT středníkem.

Rozšíření dotazu na vrácení hodnoty SCOPE_IDENTITY()

Obrázek 26: Rozšíření dotazu na vrácení SCOPE_IDENTITY() hodnoty (kliknutím zobrazíte obrázek s plnou velikostí)

Nakonec pojmenujte novou metodu InsertProduct.

Nastavení názvu nové metody na InsertProduct

Obrázek 27: Nastavení názvu nové metody na InsertProduct (kliknutím zobrazíte obrázek s plnou velikostí)

Když se vrátíte do Návrháře datové sady, uvidíte, že ProductsTableAdapter obsahuje novou metodu, InsertProduct. Pokud tato nová metoda nemá parametr pro každý sloupec v Products tabulce, pravděpodobně jste zapomněli ukončit INSERT příkaz středníkem. Nakonfigurujte metodu InsertProduct a ujistěte se, že máte středník, který INSERT odděluje příkazy a SELECT příkazy.

Ve výchozím nastavení metody vložení vydávají metody bez dotazu metody, což znamená, že vracejí počet ovlivněných řádků. Chceme InsertProduct však, aby metoda vrátila hodnotu vrácenou dotazem, nikoli počet ovlivněných řádků. Chcete-li toho dosáhnout, upravte InsertProduct vlastnost metody ExecuteMode na Scalar.

Změna vlastnosti ExecuteMode na skalární

Obrázek 28: Změna ExecuteMode vlastnosti na Scalar (Kliknutím zobrazíte obrázek v plné velikosti)

Následující kód ukazuje tuto novou InsertProduct metodu v akci:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim new_productID As Integer = Convert.ToInt32(productsAdapter.InsertProduct( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 10, 0, 10, false))
productsAdapter.Delete(new_productID)

Krok 5: Dokončení vrstvy přístupu k datům

Všimněte si, že ProductsTableAdapters třída vrací CategoryID hodnoty a SupplierID hodnoty z Products tabulky, ale nezahrnuje CategoryName sloupec z Categories tabulky nebo CompanyName sloupce z Suppliers tabulky, i když jsou to pravděpodobně sloupce, které chceme zobrazit při zobrazení informací o produktu. Můžeme rozšířit počáteční metodu TableAdapter, aby zahrnovala jak CategoryName CompanyName hodnoty sloupců, tak i hodnoty sloupců, které aktualizují dataTable silného typu tak, GetProducts()aby zahrnovaly i tyto nové sloupce.

To však může představovat problém, protože metody TableAdapter pro vkládání, aktualizace a odstraňování dat jsou založeny na této počáteční metodě. Naštěstí nejsou automaticky generované metody vkládání, aktualizace a odstraňování ovlivněny poddotazy v SELECT klauzuli. Když se postaráme o přidání dotazů do Categories poddotazů Suppliers a jako poddotazů, JOIN nebudeme muset tyto metody pro úpravy dat přepracovat. Klikněte pravým tlačítkem myši na metodu GetProducts() ProductsTableAdapter a zvolte Konfigurovat. Potom klauzuli SELECT upravte tak, aby vypadala takto:

SELECT     ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
(SELECT CategoryName FROM Categories
WHERE Categories.CategoryID = Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM         Products

Aktualizace příkazu SELECT pro getProducts() – metoda

Obrázek 29: Aktualizace SELECT příkazu pro metodu GetProducts() (kliknutím zobrazíte obrázek s plnou velikostí)

Po aktualizaci GetProducts() metody pro použití tohoto nového dotazu dataTable bude obsahovat dva nové sloupce: CategoryName a SupplierName.

Tabulka Products DataTable má dva nové sloupce.

Obrázek 30: Datová Products tabulka obsahuje dva nové sloupce

Chvilku SELECT aktualizujte i klauzuli v GetProductsByCategoryID(categoryID) metodě.

Pokud aktualizujete GetProducts() SELECT syntaxi pomocí JOIN syntaxe DataSet Designer nebude moct automaticky vygenerovat metody pro vkládání, aktualizaci a odstraňování databázových dat pomocí přímého vzoru databáze. Místo toho je budete muset ručně vytvořit podobně jako v InsertProduct předchozí části tohoto kurzu. Kromě toho budete muset ručně zadat InsertCommandhodnoty , UpdateCommanda DeleteCommand vlastnosti, pokud chcete použít vzor dávkové aktualizace.

Přidání zbývajících objektů TableAdapter

Až doteď jsme se podívali jen na práci s jednou tabulkou TableAdapter pro jednu tabulku databáze. Databáze Northwind ale obsahuje několik souvisejících tabulek, se kterými budeme muset pracovat v naší webové aplikaci. Typová datová sada může obsahovat více souvisejících datových tabulek. Proto k dokončení naší DAL potřebujeme přidat datové tabulky pro ostatní tabulky, které budeme používat v těchto kurzech. Pokud chcete přidat nový TableAdapter do typové datové sady, otevřete Návrhář datové sady, klikněte pravým tlačítkem myši v Návrháři a zvolte Přidat / TableAdapter. Tím se vytvoří nová tabulka DataTable a TableAdapter a provede vás průvodcem, který jsme prozkoumali dříve v tomto kurzu.

Vytvoření následujících objektů TableAdapter a metod pomocí následujících dotazů zabere několik minut. Všimněte si, že dotazy v ProductsTableAdapter zahrnutí poddotazů pro získání kategorií jednotlivých produktů a názvů dodavatelů. Pokud jste postupovali podle pokynů, přidali jste už ProductsTableAdapter GetProducts() metody a GetProductsByCategoryID(categoryID) třídy.

  • ProductsTableAdapter

    • GetProducts:

      SELECT     ProductID, ProductName, SupplierID, 
      CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, 
      UnitsOnOrder, ReorderLevel, Discontinued, 
      (SELECT CategoryName FROM Categories WHERE
      Categories.CategoryID = Products.CategoryID) as 
      CategoryName, (SELECT CompanyName FROM Suppliers
      WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      
    • GetProductsByCategoryID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName,
      (SELECT CompanyName FROM Suppliers WHERE
      Suppliers.SupplierID = Products.SupplierID)
      as SupplierName
      FROM         Products
      WHERE      CategoryID = @CategoryID
      
    • GetProductsBySupplierID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE 
      Suppliers.SupplierID = Products.SupplierID) as SupplierName
      FROM         Products
      WHERE SupplierID = @SupplierID
      
    • GetProductByProductID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName 
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      WHERE ProductID = @ProductID
      
  • CategoriesTableAdapter

    • GetCategories:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      
    • GetCategoryByCategoryID:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      WHERE CategoryID = @CategoryID
      
  • SuppliersTableAdapter

    • GetSuppliers:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      
    • GetSuppliersByCountry:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE Country = @Country
      
    • GetSupplierBySupplierID:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE SupplierID = @SupplierID
      
  • EmployeesTableAdapter

    • GetEmployees:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      
    • GetEmployeesByManager:

      SELECT     EmployeeID, LastName, FirstName, Title, 
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE ReportsTo = @ManagerID
      
    • GetEmployeeByEmployeeID:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE EmployeeID = @EmployeeID
      

Návrhář datové sady po přidání čtyř objektů TableAdapter

Obrázek 31: Návrhář datové sady po přidání čtyř objektů TableAdapter (kliknutím zobrazíte obrázek s plnou velikostí)

Přidání vlastního kódu do DAL

Objekty TableAdapter a DataTables přidané do typové datové sady jsou vyjádřeny jako soubor definice schématu XML (Northwind.xsd). Tyto informace o schématu můžete zobrazit tak, že kliknete pravým tlačítkem myši na Northwind.xsd soubor v Průzkumník řešení a zvolíte Zobrazit kód.

Soubor definice schématu XML (XSD) pro datová sada typed Northwinds

Obrázek 32: Soubor definice schématu XML (XSD) pro datovou sadu typed Northwinds (Kliknutím zobrazíte obrázek s plnou velikostí)

Tyto informace o schématu se překládají do kódu jazyka C# nebo Visual Basic v době návrhu při kompilaci nebo za běhu (v případě potřeby), v jakém okamžiku je můžete procházet ladicím programem. Pokud chcete zobrazit tento automaticky generovaný kód, přejděte do zobrazení třídy a přejděte k podrobnostem na třídy TableAdapter nebo Typed DataSet. Pokud na obrazovce nevidíte zobrazení předmětu, přejděte do nabídky Zobrazení a vyberte ho tam nebo stiskněte Ctrl+Shift+C. V zobrazení třídy můžete zobrazit vlastnosti, metody a události Typed DataSet a TableAdapter třídy. Pokud chcete zobrazit kód konkrétní metody, poklikejte na název metody v zobrazení třídy nebo na něj klikněte pravým tlačítkem myši a zvolte Přejít na definici.

Prozkoumejte automaticky vygenerovaný kód výběrem možnosti Přejít k definici ze zobrazení třídy.

Obrázek 33: Kontrola automaticky generovaného kódu výběrem možnosti Přejít k definici ze zobrazení třídy

I když automaticky vygenerovaný kód může být skvělý časově úsporný, kód je často velmi obecný a je potřeba ho přizpůsobit tak, aby vyhovoval jedinečným potřebám aplikace. Riziko rozšíření automaticky generovaného kódu je ale to, že nástroj, který kód vygeneroval, se může rozhodnout, že je čas znovu vygenerovat a přepsat vlastní nastavení. S novým konceptem částečné třídy .NET 2.0 je snadné rozdělit třídu mezi více souborů. To nám umožňuje přidat do automaticky generovaných tříd vlastní metody, vlastnosti a události, aniž by se museli starat o přepsání vlastních nastavení sady Visual Studio.

Abychom si ukázali, jak přizpůsobit DAL, přidáme do třídy metodu GetProducts() SuppliersRow . Třída SuppliersRow představuje jeden záznam v Suppliers tabulce; každý dodavatel může zprostředkovatele nula na mnoho produktů, takže GetProducts() vrátí tyto produkty zadaného dodavatele. Chcete-li toho dosáhnout, vytvořte nový soubor třídy ve App_Code složce s názvem SuppliersRow.vb a přidejte následující kód:

Imports NorthwindTableAdapters
Partial Public Class Northwind
    Partial Public Class SuppliersRow
        Public Function GetProducts() As Northwind.ProductsDataTable
            Dim productsAdapter As New ProductsTableAdapter
            Return productsAdapter.GetProductsBySupplierID(Me.SupplierID)
        End Function
    End Class
End Class

Tato částečná třída dává kompilátoru pokyn, aby při sestavování Northwind.SuppliersRow třídy zahrnoval metodu GetProducts() , kterou jsme právě definovali. Pokud projekt sestavíte a pak se vrátíte do zobrazení třídy, zobrazí GetProducts() se nyní jako metoda Northwind.SuppliersRow.

GetProducts() – metoda je nyní součástí třídy Northwind.SuppliersRow

Obrázek 34: GetProducts() Metoda je nyní součástí Northwind.SuppliersRow třídy

Metodu GetProducts() lze nyní použít k vytvoření výčtu sady produktů pro konkrétního dodavatele, jak ukazuje následující kód:

Dim suppliersAdapter As New NorthwindTableAdapters.SuppliersTableAdapter()
Dim suppliers As Northwind.SuppliersDataTable = suppliersAdapter.GetSuppliers()
For Each supplier As Northwind.SuppliersRow In suppliers
    Response.Write("Supplier: " & supplier.CompanyName)
    Response.Write("<ul>")
    Dim products As Northwind.ProductsDataTable = supplier.GetProducts()
    For Each product As Northwind.ProductsRow In products
        Response.Write("<li>" & product.ProductName & "</li>")
    Next
    Response.Write("</ul><p> </p>")
Next

Tato data lze také zobrazit v libovolném asp. Webové ovládací prvky dat rozhraní NET Následující stránka používá ovládací prvek GridView se dvěma poli:

  • A BoundField, který zobrazuje název každého dodavatele a
  • TemplateField obsahující ovládací prvek BulletedList, který je vázán na výsledky vrácené metodou GetProducts() pro každého dodavatele.

V budoucích kurzech se podíváme, jak tyto hlavní sestavy zobrazit. Prozatím je tento příklad navržený tak, aby ilustroval použití vlastní metody přidané do Northwind.SuppliersRow třídy.

SuppliersAndProducts.aspx

<%@ Page Language="VB" CodeFile="SuppliersAndProducts.aspx.vb"
    AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            Suppliers and Their Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             AutoGenerateColumns="False"
             CssClass="DataWebControlStyle">
                <HeaderStyle CssClass="HeaderStyle" />
                <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                <Columns>
                    <asp:BoundField DataField="CompanyName"
                      HeaderText="Supplier" />
                    <asp:TemplateField HeaderText="Products">
                        <ItemTemplate>
                            <asp:BulletedList ID="BulletedList1"
                             runat="server" DataSource="<%# CType(CType(Container.DataItem, System.Data.DataRowView).Row, Northwind.SuppliersRow).GetProducts() %>"
                                 DataTextField="ProductName">
                            </asp:BulletedList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

SuppliersAndProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class SuppliersAndProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim suppliersAdapter As New SuppliersTableAdapter
        GridView1.DataSource = suppliersAdapter.GetSuppliers()
        GridView1.DataBind()
    End Sub
End Class

Název společnosti dodavatele je uveden v levém sloupci, jejich produkty vpravo

Obrázek 35: Název společnosti dodavatele je uveden v levém sloupci, jejich produkty vpravo (kliknutím zobrazíte obrázek plné velikosti).

Shrnutí

Při vytváření webové aplikace, která vytváří DAL, by měl být jedním z prvních kroků, ke kterému dochází před zahájením vytváření prezentační vrstvy. V sadě Visual Studio je vytvoření DAL založené na typed DataSets úkol, který lze provést za 10 až 15 minut bez psaní řádku kódu. Následující kurzy budou vycházet z tohoto DAL. V dalším kurzu definujeme řadu obchodních pravidel a podíváme se, jak je implementovat v samostatné vrstvě obchodní logiky.

Šťastné programování!

Další čtení

Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:

Školicí video o tématech obsažených v tomto kurzu

O autorovi

Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 za 24 hodin. Je dostupný na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím svého blogu, který lze najít na http://ScottOnWriting.NET.

Zvláštní díky

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí hodnotící tohoto kurzu byli Ron Green, Hilton Giesenow, Dennis Patterson, Liz Shulok, Abel Gomez a Carlos Santos. Chcete si projít nadcházející články MSDN? Pokud ano, zahoďte mi řádek na mitchell@4GuysFromRolla.com.