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

Scott Mitchell

Stáhnout PDF

V tomto kurzu začneme od samého začátku a vytvoříme vrstvu pro přístup k informacím v databázi pomocí zadaných datových sad.

Úvod

Jako vývojáři webů se naše životy točí kolem práce s daty. Vytváříme databáze pro ukládání dat, kód k jejich načtení a úpravě a webové stránky, které je shromažďují a sumarizují. Toto je první kurz v dlouhé sérii, který prozkoumá techniky implementace těchto běžných vzorů v ASP.NET 2.0. Začneme vytvořením softwarové architektury , která se skládá z vrstvy přístupu k datům (DAL) pomocí typed dataSets, vrstvy obchodní logiky (BLL), která vynucuje vlastní obchodní pravidla, a prezentační vrstvy složené z ASP.NET stránek, které sdílejí společné rozložení stránky. Po vytvoření tohoto základu back-endu přejdeme k vytváření sestav a ukážeme si, jak zobrazit, sumarizovat, shromažďovat a ověřovat data z webové aplikace. Tyto kurzy jsou zaměřené na stručné a poskytují podrobné pokyny s velkým množstvím snímků obrazovky, které vás vizuálně provedou 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 je prezentován v mnohem čitelnějších blocích.)

V těchto kurzech použijeme microsoftovou SQL Server 2005 Express Edition verzi databáze Northwind umístěnou v adresáři App_Data. Kromě databázového souboru obsahuje složka App_Data také skripty SQL pro vytvoření databáze, pokud chcete použít jinou verzi databáze. Pokud používáte jinou SQL Server verzi databáze Northwind, budete muset aktualizovat nastavení NORTHWNDConnectionString v souboruWeb.config aplikace. Webová aplikace byla vytvořena pomocí sady Visual Studio 2005 Professional Edition jako projekt webu založeného na systému souborů. Všechny kurzy však 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), potom vytvoříme vrstvu obchodní logiky (BLL) v druhém kurzu a ve třetím začneme pracovat na rozložení stránky a navigaci. Kurzy po třetím se budou stavět na základech položených v prvních třech. V tomto prvním kurzu toho musíme hodně probrat, takže spusťte 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 naši databázi. Začněte vytvořením nového webu založeného na systému souborů ASP.NET. Chcete-li to provést, přejděte do nabídky Soubor a zvolte Nový web a zobrazte dialogové okno Nový web. Zvolte šablonu ASP.NET webu, nastavte rozevírací seznam Umístění na Systém souborů, zvolte složku, do které chcete web umístit, a nastavte jazyk na C#.

Vytvoření nového souboru System-Based webu

Obrázek 1: Vytvoření nového souboru System-Based webu (kliknutím zobrazíte obrázek v plné velikosti)

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

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. Můžete také zobrazit data tabulky nebo vytvořit vlastní dotazy, a to buď ručně, nebo graficky prostřednictvím Tvůrce dotazů. Kromě toho, když sestavíme typové datové sady pro DAL, budeme muset nasměrovat Visual Studio na databázi, ze které by měly být sady Typed DataSets vytvořeny. I když můžeme tyto informace o připojení poskytnout v daném okamžiku, 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 Server 2005 Express Edition ve složce App_Data, nebo jestli máte místo toho nastavení databázového serveru Microsoft SQL Server 2000 nebo 2005.

Použití databáze ve složce App_Data

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

Databáze umístěná ve složce App_Data se automaticky přidá do Průzkumníka serveru. Za předpokladu, že máte na počítači nainstalovanou 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 také obsahovat soubory aplikace Microsoft Access .mdb, které se stejně jako jejich SQL Server protějšky automaticky přidají do Průzkumníka serveru. Pokud nechcete použít žádnou z možností SQL Server, můžete vždy nainstalovat databázi a aplikace Northwind Traders a přejít do adresáře App_Data. Mějte ale na paměti, že databáze Accessu nejsou tak bohaté na funkce jako SQL Server a nejsou navržené pro použití ve scénářích webů. Kromě toho několik z více než 35 kurzů využije některé 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 na databázový server 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 Data Connections a zvolte Přidat připojení. Pokud Průzkumník serveru nevidíte, přejděte do zobrazení nebo Průzkumníka serveru nebo stiskněte Kombinaci kláves Ctrl+Alt+S. Zobrazí se dialogové okno Přidat připojení, ve kterém 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 uzel Connections dat. Rozbalením databázového uzlu můžete prozkoumat jeho tabulky, zobrazení, uložené procedury atd.

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

Obrázek 2: Přidání připojení k databázi Northwind 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 zápisu ADO.NET kódu v části kódu stránky ASP.NET nebo pomocí ovládacího prvku SqlDataSource z části revize. V obou případech tento přístup úzce spojuje logiku přístupu k datům s prezentační vrstvou. Doporučeným přístupem je však 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( zkráceně DAL) a obvykle se implementuje jako samostatný projekt knihovny tříd. Výhody této vrstvené architektury jsou dobře zdokumentované (informace o těchto výhodách najdete v části Další čtení na konci tohoto kurzu) a jedná se o přístup, který budeme v této sérii využívat.

Veškerý kód, který je specifický pro podkladový zdroj dat, jako je vytvoření připojení k databázi, vydávání příkazů SELECT, INSERT, UPDATE, DELETE atd., by měl být umístěn v dal. Prezentační vrstva by neměla obsahovat žádné odkazy na takový přístupový kód k datům, ale měla by místo toho volat do DAL pro všechny žádosti o data. Vrstvy přístupu k datům obvykle obsahují metody pro přístup k podkladovým datům databáze. Například databáze Northwind obsahuje tabulky Products (Produkty ) a Categories (Kategorie ), které zaznamenávají produkty určené k prodeji a kategorie, do kterých patří. V našem DAL budeme mít metody jako:

  • GetCategories(), která vrátí informace o všech kategoriích.
  • GetProducts() – 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, vydají příslušný dotaz a vrátí výsledky. Je důležité, jak tyto výsledky vrátíme. 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 ten, jehož schéma je pevně definováno v době kompilace, zatímco opak, objekt s volným typem, je ten, jehož schéma není známo, dokud není za běhu.

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 jejich naplnění. Pro přístup ke konkrétnímu sloupci z tabulky DataTable s volným typem musíme použít syntaxi jako : DataTable. Rows[index]["columnName"]. Volné psaní DataTable v tomto příkladu se projevuje skutečností, že k názvu sloupce potřebujeme přistupovat pomocí řetězcového nebo řadového indexu. DataTable silného typu bude mít na druhé straně každý ze svých sloupců implementovaný jako vlastnosti, což vede k kódu, který vypadá takto: DataTable. Řádky[index].columnName.

Pokud chtějí vývojáři vrátit objekty silného typu, mohou 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 jejíž členy jsou v souladu s tímto schématem silného typu. Typed DataSet sám se skládá z tříd, které rozšiřují ADO.NET DataSet, DataTable a DataRow třídy. Kromě datových tabulek se silnými typy teď typed DataSets zahrnují také Objekty TableAdapter, což jsou třídy s metodami pro naplnění datových tabulek datové sady 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í dat mezi vrstvami.

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žívá typové datové sady.

Veškerý přístupový kód k datům se přeřadí na DAL.

Obrázek 3: Veškerý přístupový kód k datům se přeřadí na dal (kliknutím zobrazíte obrázek v plné velikosti)

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

Abychom mohli začít vytvářet dal, začneme tím, že do našeho 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.

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

Obrázek 4: Volba přidání nové sady dat do projektu (kliknutím zobrazíte obrázek v plné velikosti)

Po kliknutí na Přidat po zobrazení výzvy k přidání datové sady do složky App_Code zvolte Ano. Pak se zobrazí Designer pro Typed DataSet a spustí se Průvodce konfigurací TableAdapter, který vám umožní přidat první TableAdapter do typed DataSet.

Typed DataSet slouží jako kolekce dat silného typu; skládá se z instancí DataTable silného typu, z nichž každá se zase skládá z instancí DataRow silného typu. Pro každou z podkladových databázových tabulek, se kterou potřebujeme pracovat v této sérii kurzů, vytvoříme tabulku DataTable se silnými typy. Začněme vytvořením tabulky DataTable pro tabulku Products .

Mějte na paměti, že tabulky DataTable se silnými typy neobsahují žádné informace o tom, jak získat přístup k datům z podkladové tabulky databáze. K načtení dat pro naplnění tabulky DataTable používáme třídu TableAdapter, která funguje jako vrstva přístupu k datům. Pro naši tabulku Products DataTable bude Objekt TableAdapter obsahovat metody GetProducts(), GetProductByCategoryID(categoryID) a tak dále, které vyvoláme z prezentační vrstvy. Role DataTable je sloužit jako objekty silného typu, které se používají k předávání dat mezi vrstvami.

Průvodce konfigurací nástroje TableAdapter začne tím, že vás vyzve 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 udělat kliknutím na tlačítko Nové připojení.

Výběr databáze Northwind ze seznamu Drop-Down

Obrázek 5: Výběr databáze Northwind ze seznamu Drop-Down (kliknutím zobrazíte obrázek v plné velikosti)

Po výběru databáze a kliknutí na Další se zobrazí dotaz, jestli chcete připojovací řetězec uložit do souboruWeb.config. Uložením připojovací řetězec se vyhnete tomu, aby byl pevně kódován ve třídách 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, umístí se do oddílu <connectionStrings>, který může být volitelně zašifrován kvůli lepšímu zabezpečení nebo později upraven prostřednictvím nové stránky vlastností ASP.NET 2.0 v grafickém uživatelském rozhraní služby IIS Správa Tool, což je vhodnější pro správce.

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

Obrázek 6: Uložení připojovacího řetězce do Web.config (kliknutím zobrazíte obrázek v plné velikosti)

Dále musíme definovat schéma pro první datatable silného typu a poskytnout první metodu pro náš Objekt TableAdapter, který se použije při naplnění datové sady silného typu. Tyto dva kroky se provádí současně vytvořením dotazu, který vrátí sloupce z tabulky, které chceme v tabulce DataTable promítnout. Na konci průvodce dáme tomuto dotazu název metody. Jakmile toho dosáhnete, můžete tuto metodu vyvolat z naší prezentační vrstvy. Metoda provede definovaný dotaz a naplní datatable silného typu.

Abychom mohli začít definovat dotaz SQL, musíme nejprve uvést, jak chceme, aby tableAdapter dotaz vydal. Můžeme použít ad hoc příkaz SQL, 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í ad hoc příkazu SQL

Obrázek 7: Dotazování dat pomocí ad hoc příkazu SQL (kliknutím zobrazíte obrázek v plné velikosti)

V tomto okamžiku můžeme zadat dotaz SQL ručně. Při vytváření první metody v TableAdapter obvykle chcete, aby dotaz vrátil ty sloupce, které je třeba vyjádřit 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 tabulky Products :

Do textového pole zadejte dotaz SQL.

Obrázek 8: Zadejte dotaz 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řte dotaz 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. Ve webových projektech je "Generovat příkazy Insert, Update a Delete" jedinou rozšířenou možností vybranou ve výchozím nastavení; Pokud spustíte tohoto průvodce z knihovny tříd nebo z projektu systému Windows, bude také vybrána možnost Použít optimistickou souběžnost. Prozatím ponechte možnost Použít optimistickou souběžnost nezaškrtnutou. Optimistickou souběžnost prozkoumáme v budoucích kurzech.

Vyberte pouze možnost Generovat příkazy Insert, Update a Delete.

Obrázek 10: Vyberte možnost Pouze generovat příkazy Insert, Update a Delete (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ší na poslední obrazovku. Tady jsme požádáni o výběr metod, které se mají přidat do objektu TableAdapter. Pro naplnění dat existují dva vzory:

  • Vyplnění tabulky DataTable tímto přístupem je vytvořená metoda, která vezme DataTable jako parametr a naplní ho na základě výsledků dotazu. Například třída ADO.NET DataAdapter implementuje tento vzor pomocí metody Fill().
  • Vrátí dataTable s tímto přístupem, metoda vytvoří a vyplní DataTable a vrátí ji jako návratovou hodnotu metod.

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

Pokud je zaškrtnuté políčko GenerateDBDirectMethods, vytvoří metody Insert(), Update() a Delete() pro TableAdapter. Pokud ponecháte tuto možnost nezaškrtnutou, všechny aktualizace budou muset být provedeny prostřednictvím jediné metody Update() objektu TableAdapter, která přebírá typed DataSet, DataTable, jeden DataRow nebo pole DataRows. (Pokud jste v rozšířených vlastnostech na obrázku 9 zrušte zaškrtnutí políčka Generovat příkazy Insert, Update a Delete, nebude mít toto nastavení zaškrtávacího políčka žádný vliv.) Toto políčko ponechme zaškrtnuté.

Změňte název metody z GetData na GetProducts.

Obrázek 11: Změna názvu metody z GetData na GetProducts (kliknutím zobrazíte obrázek v plné velikosti)

Dokončete průvodce kliknutím na Dokončit. Po zavření průvodce se vrátíme do Designer DataSet, která zobrazuje tabulku DataTable, kterou jsme právě vytvořili. Seznam sloupců můžete zobrazit v tabulce Products DataTable (ProductID, ProductName atd.) a také metody ProductsTableAdapter (Fill() a GetProducts()).

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

Obrázek 12: DataTable produktů a ProductsTableAdapter byly přidány do typové datové sady (kliknutím zobrazíte obrázek v plné velikosti).

V tomto okamžiku máme Typed DataSet s jednou DataTable (Northwind.Products) a silnou třídou DataAdapter (NorthwindTableAdapters.ProductsTableAdapter) s metodou GetProducts(). Tyto objekty lze použít pro přístup k seznamu všech produktů z kódu, jako jsou:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
    new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;
products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products)
    Response.Write("Product: " + productRow.ProductName + "<br />");

Tento kód nevyžaduje, 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ězce, dotazy SQL ani uložené procedury. Místo toho nám TableAdapter poskytuje kód přístupu k datům na nízké úrovni.

Každý objekt použitý v tomto příkladu je také silného typu, což umožňuje sadě Visual Studio poskytovat IntelliSense a kontrolu typů v době kompilace. A nejlepší ze všech datových tabulek vrácených objektem TableAdapter mohou být vázány na ASP.NET datových webových ovládacích prvků, 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 v rámci obslužné rutiny události Page_Load pouze ve třech řádcích kódu.

AllProducts.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AllProducts.aspx.cs"
    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>
        <h2>
            All Products</h2>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

AllProducts.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class AllProducts : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ProductsTableAdapter productsAdapter = new
         ProductsTableAdapter();
        GridView1.DataSource = productsAdapter.GetProducts();
        GridView1.DataBind();
    }
}

Seznam produktů se zobrazí v zobrazení GridView.

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

I když tento příklad vyžadoval, abychom do obslužné rutiny události Page_Load stránky ASP.NET napsali tři řádky kódu, v budoucích kurzech prozkoumáme, jak pomocí ObjectDataSource deklarativně načíst data z DAL. S ObjectDataSource nebudeme muset psát žá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 tomto okamžiku má třída ProductsTableAdapter pouze jednu metodu GetProducts(), která vrací všechny produkty v databázi. I když je schopnost pracovat se všemi produkty určitě užitečná, někdy budeme chtít načíst informace o konkrétním produktu nebo všech produktech, které patří do určité kategorie. Pokud chcete přidat takové funkce do naší 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 Designer DataSet, klikněte pravým tlačítkem v části ProductsTableAdapter a zvolte Přidat dotaz.

Klikněte pravým tlačítkem na TableAdapter a zvolte Přidat dotaz.

Obrázek 14: Right-Click na TableAdapter a zvolte Přidat dotaz

Nejprve se zobrazí dotaz, jestli chceme přistupovat k databázi pomocí ad hoc příkazu SQL nebo nové nebo existující uložené procedury. Pojďme znovu použít ad hoc příkaz SQL. 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 příkaz SELECT , který vrátí řádky.

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

Obrázek 15: Volba vytvoření příkazu SELECT , který vrací řádky (kliknutím zobrazíte obrázek v plné velikosti)

Dalším krokem je definování dotazu SQL používaného pro přístup k datům. Vzhledem k tomu, že chceme vrátit jenom ty produkty, které patří do určité kategorie, použiju stejný příkaz SELECT z GetProducts(), ale přidám následující klauzuli WHERE : WHERE CategoryID = @CategoryID. Parametr @CategoryID označuje průvodci 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 pro vrácení pouze produktů v zadané kategorii.

Obrázek 16: Zadání dotazu pouze na vrácení produktů v zadané kategorii (kliknutím zobrazíte obrázek v plné velikosti)

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. Pro vzor Fill změňme název na FillByCategoryID a pro návratový vzor DataTable (metody GetX ) použijeme GetProductsByCategoryID.

Zvolte názvy pro metody TableAdapter.

Obrázek 17: Volba názvů pro metody TableAdapter (kliknutím zobrazíte obrázek v plné velikosti)

Po dokončení průvodce Designer DataSet obsahuje nové metody TableAdapter.

Produkty se teď dají dotazovat podle kategorie.

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

Zkuste přidat metodu GetProductByProductID(productID) pomocí stejné techniky.

Tyto parametrizované dotazy je možné testovat přímo z Designer DataSet. Klikněte pravým tlačítkem na metodu v sadě TableAdapter a zvolte Náhled dat. Pak zadejte hodnoty, které se mají použít pro parametry, a klikněte na Náhled.

Zobrazí se produkty, které patří do kategorie Nápoje.

Obrázek 19: Zobrazují se produkty, které patří do kategorie Nápoje (kliknutím zobrazíte obrázek v plné velikosti).

Pomocí metody GetProductsByCategoryID(categoryID) v dal teď můžeme vytvořit ASP.NET stránku, která zobrazí jenom ty produkty v zadané kategorii. Následující příklad ukazuje všechny produkty, které jsou v kategorii Nápoje, které mají ID kategorie 1.

Beverages.asp

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Beverages.aspx.cs"
    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>
        <h2>Beverages</h2>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

Beverages.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class Beverages : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ProductsTableAdapter productsAdapter = new
         ProductsTableAdapter();
        GridView1.DataSource =
          productsAdapter.GetProductsByCategoryID(1);
        GridView1.DataBind();
    }
}

Tyto produkty v kategorii Nápoje jsou zobrazeny

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

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

Pro vkládání, aktualizaci a odstraňování dat se běžně používají dva vzory. První vzor, který budu volat přímý vzor databáze, zahrnuje vytvoření metod, které při vyvolání vyvolají do databáze příkaz INSERT, UPDATE nebo DELETE , 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, data a časy atd.), které odpovídají hodnotám pro vložení, aktualizaci nebo odstranění. Například s tímto vzorem pro tabulku Products by metoda delete převzala celočíselný parametr, který označuje ProductID záznamu, který se má odstranit, zatímco metoda insert by převzala řetězec pro ProductName, desetinné číslo pro UnitPrice, celé číslo pro UnitsOnStock a tak dále.

Každý požadavek na vložení, aktualizaci a odstranění se okamžitě odešle do databáze.

Obrázek 21: Každý požadavek na vložení, aktualizaci a odstranění se okamžitě odešle do databáze (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á metodě aktualizace. Tato metoda pak vytvoří výčet předaných objektů DataRows, určí, jestli byly změněny, přidány nebo odstraněny (prostřednictvím hodnoty vlastnosti RowState dataRow) a pro každý záznam vydá příslušný požadavek databáze.

Při vyvolání metody Update se všechny změny synchronizují s databází.

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

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

Oba vzory úprav dat používají Vlastnosti InsertCommand, UpdateCommand a DeleteCommand objektu TableAdapter k vydání jejich insert, UPDATE a DELETE příkazy do databáze. Vlastnosti InsertCommand, UpdateCommand a DeleteCommand můžete zkontrolovat a upravit tak, že kliknete na Objekt TableAdapter v Designer DataSet a přejdete na okno Vlastnosti. (Ujistěte se, že jste vybrali TableAdapter a že je objekt ProductsTableAdapter vybraný v rozevíracím seznamu v okno Vlastnosti.)

Objekt TableAdapter má vlastnosti InsertCommand, UpdateCommand a DeleteCommand.

Obrázek 23: Objekt TableAdapter má vlastnosti InsertCommand, UpdateCommand a DeleteCommand (kliknutím zobrazíte obrázek v plné velikosti)

Chcete-li prozkoumat nebo upravit některou z těchto vlastností databázového příkazu, klikněte na podmnožině CommandText , která zobrazí Tvůrce dotazů.

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

Obrázek 24: Konfigurace příkazů INSERT, UPDATE a 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 na skladě nebo méně:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
  new NorthwindTableAdapters.ProductsTableAdapter();
// For each product, double its price if it is not discontinued and
// there are 25 items in stock or less
Northwind.ProductsDataTable products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow product in products)
   if (!product.Discontinued && product.UnitsInStock <= 25)
      product.UnitPrice *= 2;
// Update the products
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ý:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
    new NorthwindTableAdapters.ProductsTableAdapter();
// Delete the product with ProductID 3
productsAdapter.Delete(3);
// Update Chai (ProductID of 1), setting the UnitsOnOrder to 15
productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",
  18.0m, 39, 15, 10, false, 1);
// Add a new product
productsAdapter.Insert("New Product", 1, 1,
  "12 tins per carton", 14.95m, 15, 0, 10, false);

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

Metody Insert(), Update() a Delete() vytvořené přímou metodou databáze můžou být trochu těžkopádné, zejména u tabulek s mnoha sloupci. Když se podíváme na předchozí příklad kódu, není bez pomoci IntelliSense jasné, jaký sloupec tabulky Products se mapuje na každý vstupní parametr metod Update() a Insert(). Může se stát, že chceme aktualizovat jenom jeden nebo dva sloupce nebo chceme přizpůsobenou metodu Insert(), která možná vrátí hodnotu pole IDENTITY (auto-increment) nově vloženého záznamu.

Pokud chcete vytvořit takovou vlastní metodu, vraťte se do Designer DataSet. Klikněte pravým tlačítkem 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 vrátí hodnotu ProductID nově přidaného záznamu. Proto se rozhodněte vytvořit dotaz INSERT .

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 tabulky Products (kliknutím zobrazíte obrázek v plné velikosti)

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

Rozšíření dotazu tak, aby vracel hodnotu SCOPE_IDENTITY()

Obrázek 26: Rozšíření dotazu tak, aby vrátil hodnotu SCOPE_IDENTITY() (kliknutím zobrazíte obrázek v plné velikosti)

Nakonec novou metodu pojmenujte InsertProduct.

Nastavte název nové metody na InsertProduct.

Obrázek 27: Nastavení názvu nové metody na InsertProduct (kliknutím zobrazíte obrázek v plné velikosti)

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

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

Změňte vlastnost ExecuteMode na skalární.

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

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

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
    new NorthwindTableAdapters.ProductsTableAdapter();
// Add a new product
int new_productID = Convert.ToInt32(productsAdapter.InsertProduct
    ("New Product", 1, 1, "12 tins per carton", 14.95m, 10, 0, 10, false));
// On second thought, delete the product
productsAdapter.Delete(new_productID);

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

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

To však může představovat problém, protože metody TableAdapter pro vkládání, aktualizaci a odstraňování dat jsou založeny na této počáteční metodě. Automaticky generované metody vkládání, aktualizace a odstraňování naštěstí nejsou ovlivněny poddotazy v klauzuli SELECT . Když přidáme naše dotazy do kategorií a dodavatelů jako poddotazy, místo příkazu JOIN , vyhneme se tomu, že tyto metody pro úpravu dat přepracováváme. Klikněte pravým tlačítkem na metodu GetProducts() v sadě ProductsTableAdapter a zvolte Konfigurovat. Potom upravte klauzuli SELECT 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 metodu GetProducts()

Obrázek 29: Aktualizace příkazu SELECT pro metodu GetProducts() (kliknutím zobrazíte obrázek v plné velikosti)

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

Tabulka Products DataTable má dva nové sloupce.

Obrázek 30: Tabulka DataTable produktů má dva nové sloupce

Chvíli si také aktualizujte klauzuli SELECT v metodě GetProductsByCategoryID(categoryID).

Pokud aktualizujete metodu GetProducts()SELECT pomocí syntaxe JOIN, Designer DataSet nebude moct automaticky vygenerovat metody pro vkládání, aktualizaci a odstraňování dat databáze pomocí modelu db direct. Místo toho je budete muset vytvořit ručně podobně jako metodu InsertProduct dříve v tomto kurzu. Kromě toho budete muset ručně zadat hodnoty vlastností InsertCommand, UpdateCommand a DeleteCommand , pokud chcete použít model dávkové aktualizace.

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

Až dosud jsme se zabývali pouze prací s jedním tableAdapter pro jednu tabulku databáze. Databáze Northwind ale obsahuje několik souvisejících tabulek, se kterými budeme muset pracovat ve webové aplikaci. Typed DataSet může obsahovat více souvisejících datových tabulek. K dokončení dal proto potřebujeme přidat DataTables pro ostatní tabulky, které budeme v těchto kurzech používat. Pokud chcete přidat nový TableAdapter do typové datové sady, otevřete Designer DataSet, klikněte pravým tlačítkem na Designer a zvolte Add / TableAdapter. Tím vytvoříte novou tabulku DataTable a objekt TableAdapter a provedete průvodcem, který jsme prozkoumali dříve v tomto kurzu.

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

  • 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

    • Získatkategorie:

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

Datová sada Designer po přidání čtyř objektů TableAdapter

Obrázek 31: Datová sada Designer po přidání čtyř objektů TableAdapter (kliknutím zobrazíte obrázek v plné velikosti)

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

Objekty TableAdapter a DataTable přidané do typed DataSet 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 na soubor Northwind.xsd v Průzkumník řešení a zvolíte Zobrazit kód.

Soubor definice schématu XML (XSD) pro typed DataSet Northwinds

Obrázek 32: Soubor definice schématu XML (XSD) pro sadu dat typed Northwinds (kliknutím zobrazíte obrázek v plné velikosti)

Tyto informace o schématu jsou přeloženy do kódu jazyka C# nebo Visual Basic v době návrhu při kompilaci nebo za běhu (v případě potřeby), kdy je můžete krokovat pomocí ladicího programu. Chcete-li zobrazit tento automaticky vygenerovaný kód, přejděte do zobrazení třídy a přejděte k podrobnostem třídy TableAdapter nebo Typed DataSet. Pokud zobrazení předmětu na obrazovce nevidíte, přejděte do nabídky Zobrazení a vyberte ji odsud nebo stiskněte Kombinaci kláves Ctrl+Shift+C. V zobrazení třídy můžete vidět vlastnosti, metody a události Typed DataSet a TableAdapter třídy. Pokud chcete zobrazit kód pro určitou metodu, poklikejte na název metody v zobrazení třídy nebo na něj klikněte pravým tlačítkem a zvolte Přejít k definici.

Zkontrolujte 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 generovaný kód může skvěle ušetřit čas, 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 však spočívá v tom, že nástroj, který kód vygeneroval, může rozhodnout, že je čas znovu vygenerovat a přepsat vaše vlastní nastavení. S novým konceptem částečné třídy v .NET 2.0 je snadné rozdělit třídu mezi několik souborů. To nám umožňuje přidat naše vlastní metody, vlastnosti a události do automaticky generovaných tříd, aniž by se museli starat o přepsání našich vlastních nastavení v sadě Visual Studio.

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

using System;
using System.Data;
using NorthwindTableAdapters;
public partial class Northwind
{
    public partial class SuppliersRow
    {
        public Northwind.ProductsDataTable GetProducts()
        {
            ProductsTableAdapter productsAdapter =
             new ProductsTableAdapter();
            return
              productsAdapter.GetProductsBySupplierID(this.SupplierID);
        }
    }
}

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

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

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

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

NorthwindTableAdapters.SuppliersTableAdapter suppliersAdapter =
    new NorthwindTableAdapters.SuppliersTableAdapter();
// Get all of the suppliers
Northwind.SuppliersDataTable suppliers =
  suppliersAdapter.GetSuppliers();
// Enumerate the suppliers
foreach (Northwind.SuppliersRow supplier in suppliers)
{
    Response.Write("Supplier: " + supplier.CompanyName);
    Response.Write("<ul>");
    // List the products for this supplier
    Northwind.ProductsDataTable products = supplier.GetProducts();
    foreach (Northwind.ProductsRow product in products)
        Response.Write("<li>" + product.ProductName + "</li>");
    Response.Write("</ul><p> </p>");
}

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

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

V budoucích kurzech prozkoumáme, jak takové sestavy s podrobnostmi 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="C#" CodeFile="SuppliersAndProducts.aspx.cs"
    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>
        <h2>
            Suppliers and Their Products</h2>
        <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="<%# ((Northwind.SuppliersRow) ((System.Data.DataRowView) Container.DataItem).Row).GetProducts() %>"
                                 DataTextField="ProductName">
                            </asp:BulletedList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

SuppliersAndProducts.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindTableAdapters;
public partial class SuppliersAndProducts : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SuppliersTableAdapter suppliersAdapter = new
          SuppliersTableAdapter();
        GridView1.DataSource = suppliersAdapter.GetSuppliers();
        GridView1.DataBind();
    }
}

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

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

Souhrn

Při vytváření webové aplikace by vytvoření DAL mělo být jedním z prvních kroků, který nastane před tím, než začnete vytvářet prezentační vrstvu. V sadě Visual Studio je vytvoření DAL založené na typed dataSets úkol, který je možné provést za 10 až 15 minut bez napsání řádku kódu. Další 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.

Všechno nejlepší na programování!

Další čtení

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

Instruktážní video k tématům obsaženým v tomto kurzu

O autorovi

Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho zastihnout na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na adrese http://ScottOnWriting.NET.

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty pro tento kurz byli Ron Green, Hilton Giesenow, Dennis Patterson, Liz Shulok, Abel Gomez a Carlos Santos. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.