Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
által Scott Mitchell
Ebben az oktatóanyagban a kezdetektől kezdve létrehozzuk az adatelérési réteget (DAL) a gépelt adathalmazok használatával az adatbázisok adatainak eléréséhez.
Bevezetés
Webfejlesztőkként az életünk az adatokkal való munka körül forog. Adatbázisokat hozunk létre az adatok tárolásához, az adatok lekéréséhez és módosításához szükséges kódokat, valamint weblapokat, hogy összegyűjtsük és összegezzük azokat. Ez egy hosszadalmas sorozat első oktatóanyaga, amely a 2.0-s ASP.NET ezen gyakori minták implementálásának technikáit mutatja be. Először létrehozunk egy adatelérési rétegből (DAL) álló szoftverarchitektúrát gépelt adathalmazokkal, egy üzleti logikai réteggel (BLL), amely egyéni üzleti szabályokat kényszerít ki, valamint egy ASP.NET lapból álló bemutatóréteget, amely közös lapelrendezést használ. A háttérrendszer alaprendszerének lefektetése után áttérünk a jelentéskészítésre, amely bemutatja, hogyan jeleníthet meg, összegezhet, gyűjthet és érvényesíthet adatokat egy webalkalmazásból. Ezek az oktatóanyagok tömörek, és részletes útmutatást nyújtanak rengeteg képernyőfelvétellel, hogy vizuálisan végigvezethessenek a folyamaton. Minden oktatóanyag C# és Visual Basic verzióban érhető el, és tartalmazza a használt teljes kód letöltését. (Ez az első oktatóanyag meglehetősen hosszadalmas, de a többi sokkal emészthetőbb darabkákban jelenik meg.)
Ezekhez az oktatóanyagokhoz a Northwind-adatbázis Microsoft SQL Server 2005 Express Edition verzióját fogjuk használni, amely a App_Data könyvtárban található. Az adatbázisfájl mellett a App_Data mappa tartalmazza az adatbázis létrehozásához szükséges SQL-szkripteket is, ha más adatbázisverziót szeretne használni. Ha a Northwind-adatbázis másik SQL Server-verzióját használja, frissítenie kell a NORTHWNDConnectionString beállítást az alkalmazás Web.config fájljában. A webalkalmazás a Visual Studio 2005 Professional Edition fájlrendszeralapú webhelyprojektként készült. Azonban az összes oktatóanyag egyformán jól fog működni a Visual Studio 2005 Visual Web Developer ingyenes verziójával.
Ebben az oktatóanyagban a kezdetektől kezdve létrehozzuk az adatelérési réteget (DAL), majd a második oktatóanyagban létrehozzuk az Üzleti logikai réteget (BLL), majd a harmadikban az oldalelrendezést és a navigációt. A harmadik utáni oktatóanyagok az első háromban lefektetett alapra épülnek. Sok mindent kell bemutatnunk ebben az első oktatóanyagban, ezért indítsuk el a Visual Studiót, és kezdjük el!
1. lépés: Webes projekt létrehozása és csatlakozás az adatbázishoz
Az adatelérési réteg (DAL) létrehozása előtt először létre kell hoznunk egy webhelyet, és be kell állítanunk az adatbázist. Először hozzon létre egy új fájlrendszeralapú ASP.NET webhelyet. Ehhez nyissa meg a Fájl menüt, és válassza az Új webhely lehetőséget az Új webhely párbeszédpanel megjelenítésével. Válassza ki a ASP.NET webhelysablont, állítsa a Hely legördülő listát fájlrendszerre, válasszon egy mappát a webhely elhelyezéséhez, és állítsa a nyelvet C#-ra.
1. ábra: Új fájl létrehozása System-Based webhely (ide kattintva megtekintheti a teljes méretű képet)
Ezzel létrehoz egy új webhelyet egy Default.aspx ASP.NET laplal és egy App_Data mappával.
A webhely létrehozása után a következő lépés az adatbázisra mutató hivatkozás hozzáadása a Visual Studio Kiszolgálókezelőjében. Ha hozzáad egy adatbázist a Kiszolgálókezelőhöz, táblákat, tárolt eljárásokat, nézeteket és egyebeket vehet fel a Visual Studióból. Megtekintheti a táblaadatokat, vagy létrehozhat saját lekérdezéseket kézzel vagy grafikusan a Lekérdezésszerkesztőn keresztül. Ezenkívül a DAL típusozott adathalmazainak létrehozásakor a Visual Studiót arra az adatbázisra kell irányítanunk, amelyből a gépelt adathalmazokat létre kell hoznunk. Bár ezen időpontban meg tudjuk adni ezeket a kapcsolati adatokat, a Visual Studio automatikusan feltölti a Kiszolgálókezelőben már regisztrált adatbázisok legördülő listáját.
A Northwind-adatbázis Kiszolgálókezelőhöz való hozzáadásának lépései attól függenek, hogy az SQL Server 2005 Express Edition-adatbázist szeretné-e használni a App_Data mappában, vagy microsoft SQL Server 2000 vagy 2005 adatbázis-kiszolgálót szeretne használni.
Adatbázis használata a App_Data mappában
Ha nem rendelkezik SQL Server 2000- vagy 2005-ös adatbázis-kiszolgálóval a csatlakozáshoz, vagy egyszerűen el szeretné kerülni az adatbázis adatbázis-kiszolgálóhoz való hozzáadását, használhatja a letöltött webhely App_Data mappájában (NORTHWND) található Northwind-adatbázis SQL Server 2005 Express Edition verzióját. MDF).
A App_Data mappába helyezett adatbázis automatikusan bekerül a Kiszolgálókezelőbe. Feltéve, hogy az SQL Server 2005 Express Edition telepítve van a gépére, látnia kell egy NORTHWND.MDF nevű csomópontot a Kiszolgáló Felfedezőben, amelyet kibővíthet és felfedezheti a táblákat, nézeteket, tárolt eljárásokat stb. (lásd a 2. ábrát).
A App_Data mappa a Microsoft Access .mdb fájlokat is tárolhatja, amelyek az SQL Server-megfelelőikhez hasonlóan automatikusan bekerülnek a Kiszolgálókezelőbe. Ha nem szeretné használni az SQL Server egyik beállítását sem, telepítheti a Northwind Traders adatbázisát és alkalmazásait , és a App_Data könyvtárba ugrahat. Ne feledje azonban, hogy az Access-adatbázisok nem olyan funkciókban gazdagok, mint az SQL Server, és nem webhelyekhez való használatra készültek. Ezenkívül a 35+ oktatóanyagok közül néhány olyan adatbázisszintű funkciókat fog használni, amelyeket az Access nem támogat.
Csatlakozás az adatbázishoz Microsoft SQL Server 2000 vagy 2005 adatbázis-kiszolgálón
Másik lehetőségként kapcsolódhat egy adatbázis-kiszolgálón telepített Northwind-adatbázishoz. Ha az adatbázis-kiszolgáló még nem telepítette a Northwind-adatbázist, először hozzá kell adnia az adatbázis-kiszolgálóhoz az oktatóanyag letöltésében szereplő telepítési szkript futtatásával.
Miután telepítette az adatbázist, lépjen a Visual Studióban a Kiszolgálókezelőbe, kattintson a jobb gombbal az Adatkapcsolatok csomópontra, és válassza a Kapcsolat hozzáadása lehetőséget. Ha nem látja a Kiszolgálókezelőt, nyissa meg a Nézet/ Kiszolgálókezelőt, vagy nyomja le a Ctrl+Alt+S billentyűkombinációt. Ekkor megjelenik a Kapcsolat hozzáadása párbeszédpanel, ahol megadhatja a csatlakozni kívánt kiszolgálót, a hitelesítési adatokat és az adatbázis nevét. Miután sikeresen konfigurálta az adatbázis kapcsolati adatait, és az OK gombra kattintott, az adatbázis csomópontként lesz hozzáadva az Adatkapcsolatok csomópont alatt. Az adatbáziscsomópont kibontásával megismerheti a táblákat, nézeteket, tárolt eljárásokat stb.
2. ábra: Kapcsolat hozzáadása az adatbázis-kiszolgáló Northwind-adatbázisához
2. lépés: Az adatelérési réteg létrehozása
Az adatok használatakor az egyik lehetőség az adatspecifikus logika beágyazása közvetlenül a bemutató rétegbe (egy webalkalmazásban a ASP.NET lapok alkotják a bemutatóréteget). Ez lehet ADO.NET kód írása a ASP.NET lap kódrészletében, vagy az SqlDataSource vezérlő használata a korrektúrarészből. Ez a megközelítés mindkét esetben szorosan összekapcsolja az adatelérési logikát a bemutató réteggel. Az ajánlott módszer azonban az adatelérési logika elkülönítése a bemutató rétegtől. Ezt a különálló réteget rövidesen adatelérési rétegnek, DAL-nak nevezik, és általában külön osztálytár-projektként implementálják. A rétegzett architektúra előnyei jól dokumentálva vannak (az oktatóanyag végén található "További olvasmányok" című szakaszban talál információkat ezekről az előnyökről), és ez a megközelítés, amelyet ebben a sorozatban fogunk alkalmazni.
Az alapul szolgáló adatforrásra jellemző összes kódnak, például az adatbázishoz való kapcsolódásnak, a SELECT, INSERT, UPDATE és DELETE parancsok kiadásának és így tovább, a DAL-ban kell lennie. A bemutató réteg nem tartalmazhat ilyen adatelérési kódra mutató hivatkozásokat, hanem a DAL-ba irányuló hívásokat kell kezdeményeznie az összes adatkéréshez. Az adatelérési rétegek általában az alapul szolgáló adatbázisadatok elérésére szolgáló módszereket tartalmaznak. A Northwind-adatbázis például termékek és kategóriák táblával rendelkezik, amelyek rögzítik az eladásra szánt termékeket és azokat a kategóriákat, amelyekhez tartoznak. A DAL-ban a következő módszerek lesznek:
- GetCategories(), amely az összes kategóriára vonatkozó információkat adja vissza
- GetProducts(), amely az összes termékre vonatkozó információkat adja vissza
- GetProductsByCategoryID(categoryID), amely egy adott kategóriához tartozó összes terméket visszaadja
- GetProductByProductID(productID), amely egy adott termék adatait adja vissza
Ezek a metódusok meghíváskor csatlakoznak az adatbázishoz, kibocsátják a megfelelő lekérdezést, és visszaadják az eredményeket. Fontos, hogy hogyan adjuk vissza ezeket az eredményeket. Ezek a metódusok egyszerűen visszaadhatnak egy adatbázis-lekérdezés által kitöltött Adathalmazt vagy DataReadert, de ideális esetben ezeket az eredményeket erősen gépelt objektumokkal kell visszaadni. Az erősen típusos objektumok olyanok, amelyek sémája már a fordítás idején mereven meg van határozva, míg ezzel szemben a lazán típusos objektumok sémája csak futásidőben válik ismertté.
A DataReader és az Adatkészlet (alapértelmezés szerint) például lazán gépelt objektumok, mivel a sémájukat a feltöltéshez használt adatbázis-lekérdezés által visszaadott oszlopok határozzák meg. Ha egy adott oszlopot egy lazán gépelt DataTable-ból szeretne elérni, a következő szintaxist kell használnia: DataTable. Sorok[index]["columnName"]. A DataTable laza beírását ebben a példában az mutatja, hogy sztring- vagy sorszámindex használatával kell elérnünk az oszlop nevét. Az erősen gépelt DataTable viszont minden oszlopát tulajdonságként fogja implementálni, így a következő kód jelenik meg: DataTable. Sorok[index].columnName.
Az erősen gépelt objektumok visszaadásához a fejlesztők létrehozhatják saját egyéni üzleti objektumaikat, vagy használhatnak gépelt adathalmazokat. Az üzleti objektumokat a fejlesztő olyan osztályként valósítja meg, amelynek tulajdonságai jellemzően az üzleti objektum alapjául szolgáló adatbázistábla oszlopait tükrözik. A gépelt adatkészlet egy olyan osztály, amelyet a Visual Studio készít el egy adatbázisséma alapján, és amelynek tagjai a séma szerint szigorúan típusozottak. Maga a Gépelt adathalmaz olyan osztályokból áll, amelyek kibővítik a ADO.NET DataSet, DataTable és DataRow osztályokat. Az erős típusú Adattáblák mellett a gépelt Adathalmazok most már TableAdaptereket is tartalmaznak, amelyek olyan osztályok, amelyek az Adathalmaz Adattábláinak feltöltésére és az Adattáblákon belüli módosítások adatbázisba való visszaírására szolgálnak.
Megjegyzés:
A gépelt adathalmazok és az egyéni üzleti objektumok használatának előnyeiről és hátrányairól az adatréteg-összetevők tervezésével és az adatok rétegeken keresztüli átadásával kapcsolatos témakörben olvashat bővebben.
Ezekhez az oktatóanyagokhoz erősen gépelt adathalmazokat fogunk használni. A 3. ábra bemutatja a gépelt adathalmazokat használó alkalmazás különböző rétegei közötti munkafolyamatot.
3. ábra: Az összes adatelérési kód át van helyezve a DAL-ra (kattintson ide a teljes méretű kép megtekintéséhez)
Tipizált adathalmaz és táblázat-adapter létrehozása
A DAL létrehozásához először egy gépelt adatkészletet adunk hozzá a projekthez. Ehhez kattintson a jobb gombbal a projektcsomópontra a Megoldáskezelőben, és válassza az Új elem hozzáadása lehetőséget. Válassza a DataSet lehetőséget a sablonok listájából, és nevezze el Northwind.xsd néven.
4. ábra: Új adathalmaz hozzáadása a projekthez (kattintson ide a teljes méretű kép megtekintéséhez)
Miután a Hozzáadás gombra kattintott, a rendszer arra kéri, hogy adja hozzá az Adatkészletet a App_Code mappához, válassza az Igen lehetőséget. Ekkor megjelenik a Gépelt adathalmaz tervezője, és elindul a TableAdapter konfigurációs varázsló, amely lehetővé teszi az első TableAdapter hozzáadását a gépelt adatkészlethez.
A gépelt adatkészlet erősen gépelt adatgyűjteményként szolgál; erősen gépelt DataTable-példányokból áll, amelyek mindegyike erősen gépelt DataRow-példányokból áll. Egy erősen gépelt DataTable-t hozunk létre az összes mögöttes adatbázistáblához, amellyel együtt kell dolgoznunk ebben az oktatóanyag-sorozatban. Először hozzunk létre egy DataTable-t a Products táblához.
Ne feledje, hogy az erősen gépelt DataTables nem tartalmaz semmilyen információt arról, hogyan férhet hozzá az adatokhoz a mögöttes adatbázistáblából. A DataTable feltöltéséhez egy TableAdapter osztályt használunk, amely adatelérési rétegként működik. A Products DataTable esetében a TableAdapter tartalmazza a GetProducts(), a GetProductByCategoryID(categoryID) metódusokat, és így tovább, amelyeket a bemutató rétegből fogunk meghívni. A DataTable szerepe az, hogy a rétegek közötti adatátadáshoz használt, szigorúan típusos objektumokként szolgáljon.
A TableAdapter konfigurációs varázsló azzal kezdődik, hogy megkéri, hogy válassza ki, melyik adatbázissal kell dolgoznia. A legördülő listában ezek az adatbázisok láthatók a Kiszolgálókezelőben. Ha nem adta hozzá a Northwind-adatbázist a Kiszolgálókezelőhöz, akkor most az Új kapcsolat gombra kattintva teheti meg.
5. ábra: Válassza ki a Northwind-adatbázist a Drop-Down listából (kattintson ide a teljes méretű kép megtekintéséhez)
Miután kiválasztotta az adatbázist, és a Tovább gombra kattintott, a rendszer megkérdezi, hogy menti-e a kapcsolati sztringet a Web.config fájlba. A kapcsolati sztring mentésével elkerülheti, hogy a TableAdapter osztályokban keményen kódolják, ami leegyszerűsíti a dolgokat, ha a kapcsolati sztring adatai a jövőben megváltoznak. Ha úgy dönt, hogy menti a kapcsolati sztringet a konfigurációs fájlba, az a connectionStrings< szakaszba> kerül, amely opcionálisan titkosítható a nagyobb biztonság érdekében, vagy később módosítható az IIS GUI felügyeleti eszköz új ASP.NET 2.0 tulajdonságlapján keresztül, ami a rendszergazdák számára ideálisabb.
6. ábra: Mentse a kapcsolati karakterláncot Web.config (Kattintson a teljes méretű kép megtekintéséhez)
Ezután meg kell határoznunk az első erősen gépelt DataTable sémáját, és meg kell adni az első metódust a TableAdapter számára, amelyet az erősen gépelt adatkészlet feltöltésekor használhatunk. Ezt a két lépést egyszerre hajtja végre egy olyan lekérdezés létrehozásával, amely visszaadja a datatable-ban tükrözni kívánt táblából származó oszlopokat. A varázsló végén megadunk egy metódusnevet a lekérdezésnek. A művelet elvégzése után ez a metódus meghívható a bemutató rétegből. A metódus végrehajtja a megadott lekérdezést, és feltölt egy erősen gépelt DataTable-t.
Az SQL-lekérdezés definiálásához először meg kell jelölnünk, hogy a TableAdapter hogyan adja ki a lekérdezést. Használhatunk alkalmi SQL-utasítást, létrehozhatunk egy új tárolt eljárást, vagy használhatunk egy meglévő tárolt eljárást. Ezekhez az oktatóanyagokhoz alkalmi SQL-utasításokat használunk.
7. ábra: Adatok lekérdezése alkalmi SQL-utasítással (ide kattintva megtekintheti a teljes méretű képet)
Ezen a ponton kézzel is beírhatjuk az SQL-lekérdezést. A TableAdapter első metódusának létrehozásakor általában azt szeretné, hogy a lekérdezés azokat az oszlopokat adja vissza, amelyeket a megfelelő DataTable-ban kell kifejezni. Ezt úgy érhetjük el, hogy létrehozunk egy lekérdezést, amely a Termékek tábla összes oszlopát és sorát visszaadja:
8. ábra: Írja be az SQL-lekérdezést a szövegmezőbe (kattintson ide a teljes méretű kép megtekintéséhez)
Másik lehetőségként használja a Lekérdezésszerkesztőt, és grafikusan hozza létre a lekérdezést a 9. ábrán látható módon.
9. ábra: A lekérdezés grafikus létrehozása a Lekérdezésszerkesztőn keresztül (ide kattintva megtekintheti a teljes méretű képet)
A lekérdezés létrehozása után, de a következő képernyőre lépés előtt kattintson a Speciális beállítások gombra. A webhelyprojektekben alapértelmezés szerint a "Beszúrási, frissítési és törlési utasítások létrehozása" beállítás az egyetlen speciális beállítás; ha a varázslót osztálytárból vagy Windows-projektből futtatja, akkor az "Optimista egyidejűség használata" lehetőség is be lesz jelölve. Egyelőre hagyja bejelöletlenül az "Optimista egyidejűség használata" beállítást. A jövőbeli oktatóanyagokban az optimista párhuzamosságot fogjuk megvizsgálni.
10. ábra: Csak a Beszúrás, Frissítés és Törlés utasítás létrehozása lehetőség kiválasztása (ide kattintva megtekintheti a teljes méretű képet)
A speciális beállítások ellenőrzése után kattintson a Tovább gombra a végleges képernyőre lépéshez. Itt meg kell jelölnünk, hogy mely metódusokat kell hozzáadni a TableAdapterhez. Az adatok feltöltésének két mintája van:
- Töltse ki a DataTable-t ezzel a módszerrel, ahol egy metódus jön létre, amely egy DataTable-t kap paraméterként, és a lekérdezés eredményei alapján tölti fel azt. A ADO.NET DataAdapter osztály például a Fill() metódusával valósítja meg ezt a mintát.
- Ezzel a módszerrel ad vissza egy DataTable-t, amely létrehozza és kitölti a DataTable-t, majd visszaadja a metódusok visszatérési értékeként.
A TableAdapter ezen minták egyikét vagy mindkettőt implementálhatja. Az itt megadott metódusokat is átnevezheti. Hagyja bejelölve mindkét jelölőnégyzetet, annak ellenére, hogy az oktatóanyagok során csak az utóbbi mintát fogjuk használni. Nevezze át a meglehetősen általános GetData metódust GetProducts-ra.
Ha be van jelölve, a "GenerateDBDirectMethods" utolsó jelölőnégyzet létrehozza a TableAdapter Insert(), Update() és Delete() metódusait. Ha bejelöletlenül hagyja ezt a beállítást, az összes frissítést a TableAdapter egyetlen Update() metódusával kell elvégeznie, amely a Gépelt adatkészletet, a DataTable-t, az egyetlen DataRow-t vagy a DataRows-tömböt veszi fel. (Ha a 9. ábrán szereplő speciális tulajdonságok közül nem jelölte ki a "Beszúrás, frissítés és törlési utasítások létrehozása" jelölőnégyzetet, ez a jelölőnégyzet nem lesz hatással.) Hagyja bejelölve ezt a jelölőnégyzetet.
11. ábra: A metódus nevének módosítása GetData-rólGetProducts értékre (ide kattintva megtekintheti a teljes méretű képet)
A varázsló befejezéséhez kattintson a Befejezés gombra. A varázsló bezárása után visszatérünk a DataSet Designerhez, amely az imént létrehozott Adattáblát jeleníti meg. A Products DataTable (ProductID, ProductName stb.) oszlopainak listája, valamint a ProductsTableAdapter (Fill() és a GetProducts()) metódusai láthatók.
12. ábra: A Products DataTable és a ProductsTableAdapter hozzáadva lett a gépelt adatkészlethez (kattintson ide a teljes méretű kép megtekintéséhez)
Jelenleg van egy gépelt DataSet, amely tartalmaz egy DataTable-t (Northwind.Products) és egy erősen gépelt DataAdapter osztályt (NorthwindTableAdapters.ProductsTableAdapter) egy GetProducts() metódussal. Ezek az objektumok a következő kódból származó összes termék listájának elérésére használhatók:
NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;
products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products)
Response.Write("Product: " + productRow.ProductName + "<br />");
Ez a kód nem követelte meg, hogy egy bit adathozzáférési specifikus kódot írjunk. Nem kellett példányosítani ADO.NET osztályokat, nem kellett hivatkoznunk kapcsolati sztringekre, SQL-lekérdezésekre vagy tárolt eljárásokra. Ehelyett a TableAdapter az alacsony szintű adatelérési kódot biztosítja számunkra.
Az ebben a példában használt objektumok szintén erősen típusosak, így a Visual Studio IntelliSense és fordítási idő típusú ellenőrzést biztosít. A TableAdapter által visszaadott adattáblák közül a legjobban ASP.NET adat webes vezérlőkhöz köthetők, például a GridView, a DetailsView, a DropDownList, a CheckBoxList és még sok más. Az alábbi példa azt mutatja be, hogy a GetProducts() metódus által visszaadott DataTable-t egy GridView-hoz köti, mindössze három sornyi kóddal az Page_Load eseménykezelőn belül.
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();
}
}
13. ábra: A termékek listája megjelenik egy GridView-ban (kattintson ide a teljes méretű kép megtekintéséhez)
Bár ebben a példában három sornyi kódot kellett megírnunk a ASP.NET lap Page_Load eseménykezelőjében, a jövőbeli oktatóanyagokban azt vizsgáljuk meg, hogyan használhatjuk az ObjectDataSource-t az adatok deklaratív lekérésére a DAL-ból. Az ObjectDataSource használatával nem kell kódot írni, és lapozási és rendezési támogatást is kapunk!
3. lépés: Paraméteres metódusok hozzáadása az adatelérési réteghez
Ezen a ponton a ProductsTableAdapter osztály csak egy metódussal rendelkezik, a GetProducts() metódussal, amely az adatbázis összes termékét visszaadja. Bár minden termékkel dolgozni lehet, bizonyos esetekben egy adott termékről vagy egy adott kategóriához tartozó összes termékről szeretnénk információt lekérni. Ha ilyen funkciókat szeretne hozzáadni az adatelérési réteghez, paraméteres metódusokat adhat a TableAdapterhez.
Vegyük fel a GetProductsByCategoryID(categoryID) metódust. Ha új metódust szeretne hozzáadni a DAL-hoz, térjen vissza a DataSet Designerhez, kattintson a jobb gombbal a ProductsTableAdapter szakaszban, és válassza a Lekérdezés hozzáadása lehetőséget.
14. ábra: Right-Click a TableAdapteren, és válassza a Lekérdezés hozzáadása lehetőséget
A rendszer először megkérdezi, hogy alkalmi SQL-utasítással vagy új vagy meglévő tárolt eljárással szeretnénk-e elérni az adatbázist. Válasszon újra egy alkalmi SQL-utasítást. Ezután a rendszer megkérdezi, hogy milyen típusú SQL-lekérdezést szeretnénk használni. Mivel egy adott kategóriához tartozó összes terméket vissza szeretnénk adni, egy SELECT utasítást szeretnénk írni, amely sorokat ad vissza.
Válassza a sorokat visszaadó SELECT utasítás létrehozását.
15. ábra: Válassza ki a sorokat visszaadó SELECT utasítás létrehozását (kattintson ide a teljes méretű kép megtekintéséhez)
A következő lépés az adatok eléréséhez használt SQL-lekérdezés meghatározása. Mivel csak azokat a termékeket szeretnénk visszaadni, amelyek egy adott kategóriához tartoznak, ugyanazt a SELECT utasítást használom a GetProducts()-tól, de a következő WHERE záradékot adjuk hozzá: WHERE CategoryID = @CategoryID. A @CategoryID paraméter azt jelzi a TableAdapter varázslónak, hogy a létrehozandó metódushoz a megfelelő típusú bemeneti paraméterre (azaz null értékű egész számra) lesz szükség.
16. ábra: Adjon meg egy lekérdezést, amely csak adott kategóriába tartozó termékeket ad vissza (ide kattintva megtekintheti a teljes méretű képet)
Az utolsó lépésben kiválaszthatjuk a használni kívánt adathozzáférési mintákat, valamint testre szabhatjuk a létrehozott metódusok nevét. A Kitöltési minta esetében módosítsuk a nevet FillByCategoryID-re, és az adattábla visszatérési mintájánál (az metódusok esetében) használjuk a GetProductsByCategoryID nevet.
17. ábra: Válassza ki a TableAdapter metódusok nevét (kattintson ide a teljes méretű kép megtekintéséhez)
A varázsló befejezése után a DataSet Designer tartalmazza az új TableAdapter metódusokat.
18. ábra: A termékek most már lekérdezhetők kategória szerint
Szánjon egy pillanatot arra, hogy ugyanazzal a technikával hozzáadja a GetProductByProductID(productID) metódust.
Ezek a paraméteres lekérdezések közvetlenül a DataSet Designerből tesztelhetők. Kattintson a jobb gombbal a TableAdapter metódusára, és válassza az Adatok előnézete lehetőséget. Ezután adja meg a paraméterekhez használni kívánt értékeket, és kattintson az Előnézet gombra.
19. ábra: Az Italok kategóriához tartozó termékek láthatók (Kattintson ide a teljes méretű kép megtekintéséhez)
A DAL-ban a GetProductsByCategoryID(categoryID) metódussal mostantól létrehozhatunk egy ASP.NET oldalt, amely csak azokat a termékeket jeleníti meg egy adott kategóriában. Az alábbi példa az Italok kategóriában szereplő összes terméket mutatja be, amelyek 1-ből álló CategoryID azonosítóval rendelkeznek.
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();
}
}
20. ábra: Az Italok kategóriában szereplő termékek megjelennek (Kattintson ide a teljes méretű kép megtekintéséhez)
4. lépés: Adatok beszúrása, frissítése és törlése
Az adatok beszúrására, frissítésére és törlésére két gyakran használt minta létezik. Az első minta, amelyet az adatbázis közvetlen mintájának nevezek, magában foglalja olyan metódusok létrehozását, amelyek meghíváskor egy INSERT, UPDATE vagy DELETE parancsot adnak ki az egyetlen adatbázisrekordon működő adatbázisnak. Ezeket a metódusokat általában skaláris értékek sorozatában (egész számok, sztringek, logikai értékek, DateTimes stb.) adjuk át, amelyek megfelelnek a beszúrni, frissíteni vagy törölni kívánt értékeknek. Ha például a Products tábla ezt a mintát használja, a törlési módszer egy egész szám paraméterben jelenik meg, amely a törölni kívánt rekord ProductID azonosítóját jelzi, míg a beszúrási módszer a ProductName sztringjében, a UnitPrice decimális értékében, a UnitsOnStock egész számában stb.
21. ábra: A rendszer minden beszúrási, frissítési és törlési kérelmet azonnal elküld az adatbázisnak (kattintással megtekintheti a teljes méretű képet)
A másik minta, amelyre a kötegfrissítési mintaként hivatkozom, az, hogy egy metódushívásban frissít egy teljes DataSetet, DataTable-t vagy DataRows-gyűjteményt. Ezzel a mintával a fejlesztő törli, beszúrja és módosítja az adat sorokat egy adatok táblájában, majd ezeket az adat sorokat vagy a táblát egy frissítési metódusba továbbítja. Ez a módszer ezután számba adja az átadott DataRows-adatokat, megállapítja, hogy módosították, hozzáadták vagy törölték-e őket (a DataRow RowState tulajdonságértékén keresztül), és minden rekordhoz kiadja a megfelelő adatbázis-kérelmet.
22. ábra: Minden módosítás szinkronizálva van az adatbázissal a frissítési módszer meghívásakor (kattintson ide a teljes méretű kép megtekintéséhez)
A TableAdapter alapértelmezés szerint a kötegfrissítési mintát használja, de támogatja a közvetlen adatbázis-mintát is. Mivel a TableAdapter létrehozásakor a Speciális tulajdonságok közül a "Beszúrás, frissítés és törlési utasítások létrehozása" lehetőséget választottuk, a ProductsTableAdapter tartalmaz egy Update() metódust, amely implementálja a kötegfrissítési mintát. A TableAdapter egy Update() metódust tartalmaz, amely átadható a Gépelt adatkészletnek, egy erősen gépelt DataTable-nak vagy egy vagy több DataRow-nak. Ha a TableAdapter első létrehozásakor bejelölte a "GenerateDBDirectMethods" jelölőnégyzetet, a közvetlen adatbázis-minta beszúrási(), frissítési() és delete() metódusokkal is implementálva lesz.
Mindkét adatmódosítási minta a TableAdapter InsertCommand, UpdateCommand és DeleteCommand tulajdonságát használja az INSERT, UPDATE és DELETE parancsok adatbázishoz való kiadásához. Az InsertCommand, az UpdateCommand és a DeleteCommand tulajdonságok vizsgálatához és módosításához kattintson az Adatkészlet-tervező TableAdapter elemére, majd a Tulajdonságok ablakra. (Győződjön meg arról, hogy a TableAdaptert választotta ki, és hogy a ProductsTableAdapter objektum a Tulajdonságok ablak legördülő listájában van kiválasztva.)
23. ábra: A TableAdapter insertCommand, UpdateCommand és DeleteCommand tulajdonsággal rendelkezik (ide kattintva megtekintheti a teljes méretű képet)
Az adatbázis parancstulajdonságainak vizsgálatához vagy módosításához kattintson a CommandText altulajdonságra, amely megjeleníti a Lekérdezésszerkesztőt.
24. ábra: Az INSERT, UPDATE és DELETE utasítások konfigurálása a Lekérdezésszerkesztőben (ide kattintva megtekintheti a teljes méretű képet)
Az alábbi példakód bemutatja, hogyan használhatja a kötegfrissítési mintát a nem megszűnt és 25 darab készleten lévő vagy annál kisebb termékek árának megduplázására:
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);
Az alábbi kód bemutatja, hogyan használhatja a közvetlen adatbázismintát egy adott termék programozott törlésére, majd frissítésére, majd új termék hozzáadására:
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);
Egyéni beszúrási, frissítési és törlési metódusok létrehozása
A közvetlen ADATBÁZIS-metódus által létrehozott Insert(), Update()és Delete() metódusok kissé nehézkesek lehetnek, különösen a sok oszlopot tartalmazó táblák esetében. Az előző kód példáját tekintve az IntelliSense segítsége nélkül nem teljesen egyértelmű, hogy a Products tábla oszlopai milyen bemeneti paramétereket képeznek le az Update() és insert() metódusokra. Előfordulhat, hogy csak egy vagy két oszlopot szeretnénk frissíteni, vagy olyan testreszabott Insert() metódust szeretnénk, amely esetleg az újonnan beszúrt rekord IDENTITÁS (automatikus növekmény) mezőjének értékét adja vissza.
Egy ilyen egyéni módszer létrehozásához térjen vissza az Adatkészlet-tervezőhöz. Kattintson a jobb gombbal a TableAdapterre, és válassza a Lekérdezés hozzáadása lehetőséget, és térjen vissza a TableAdapter varázslóhoz. A második képernyőn meg tudjuk jelölni a létrehozandó lekérdezés típusát. Hozzunk létre egy metódust, amely hozzáad egy új terméket, majd visszaadja az újonnan hozzáadott rekord ProductID azonosítójának értékét. Ezért válasszon egy INSERT-lekérdezést .
25. ábra: Metódus létrehozása új sor hozzáadásához a Termékek táblához (ide kattintva megtekintheti a teljes méretű képet)
A következő képernyőn megjelenik az InsertCommandCommandText parancsszövege . Bővítse ezt a lekérdezést úgy, hogy hozzáadja a SELECT SCOPE_IDENTITY() értéket a lekérdezés végén, amely visszaadja az azonos hatókörben lévő IDENTITÁS oszlopba beszúrt utolsó identitásértéket. (Tekintse meg a műszaki dokumentációt további információkért a SCOPE_IDENTITY()-ról és arról, hogy miért érdemes a SCOPE_IDENTITY() használata @@IDENTITY helyett.) A SELECT utasítás hozzáadása előtt győződjön meg arról, hogy az INSERT utasítást pontosvesszővel fejezi be.
26. ábra: A lekérdezés bővítése a SCOPE_IDENTITY() érték visszaadásához (kattintson ide a teljes méretű kép megtekintéséhez)
Végül nevezze el az új InsertProduct metódust.
27. ábra: Az új metódus nevének beállítása InsertProduct értékre (ide kattintva megtekintheti a teljes méretű képet)
Amikor visszatér a DataSet Designerhez, látni fogja, hogy a ProductsTableAdapter tartalmaz egy új metódust, az InsertProduct metódust. Ha ez az új metódus nem rendelkezik paraméterrel a Products (Termékek ) tábla minden oszlopához, akkor valószínű, hogy elfelejtette pontosvesszővel megszüntetni az INSERT utasítást. Konfigurálja az InsertProduct metódust , és győződjön meg arról, hogy az INSERT és a SELECT utasítást kettőspont választja el.
A metódusok beszúrása alapértelmezés szerint nem lekérdezési metódusokat ad vissza, ami azt jelenti, hogy az érintett sorok számát adja vissza. Azt szeretnénk azonban, hogy az InsertProduct metódus a lekérdezés által visszaadott értéket adja vissza, nem az érintett sorok számát. Ehhez állítsa az InsertProduct metódus ExecuteMode tulajdonságát skalárisra.
28. ábra: Az ExecuteMode tulajdonság módosítása skalárisra (kattintson ide a teljes méretű kép megtekintéséhez)
Az alábbi kód az új InsertProduct metódust mutatja be működés közben:
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);
5. lépés: Az adatelérési réteg befejezése
Vegye figyelembe, hogy a ProductsTableAdapters osztály a Termékek tábla CategoryID és SupplierID értékeit adja vissza, de nem tartalmazza a Kategóriák tábla CategoryName oszlopát vagy a Szállítók tábla CompanyName oszlopát, bár valószínűleg ezek az oszlopok jelennek meg a termékinformációk megjelenítésekor. Bővíthetjük a TableAdapter kezdeti metódusát, a GetProducts()-t, hogy a CategoryName és a CompanyName oszlop értékeit is belefoglaljuk, ami frissíti az erősen gépelt DataTable-t, hogy ezeket az új oszlopokat is tartalmazza.
Ez azonban problémát okozhat, mivel a TableAdapter adatbeszúrási, frissítési és törlési módszerei a kezdeti módszeren alapulnak. Szerencsére a SELECT záradékban lévő allekérdezések nem befolyásolják az automatikusan létrehozott beszúrási, frissítési és törlési módszereket. Ha a lekérdezéseinket nem JOIN formában, hanem alcsoportként adjuk hozzá a Kategóriákhoz és a Szállítókhoz, akkor elkerülhetjük, hogy az adatmódosító módszereket újra kelljen dolgoznunk. Kattintson a jobb gombbal a GetProducts() metódusra a ProductsTableAdapterben , és válassza a Konfigurálás lehetőséget. Ezután módosítsa a SELECT záradékot úgy, hogy a következőképpen nézzen ki:
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
29. ábra: Frissítse a GetProducts() metódus SELECT utasítását (kattintson ide a teljes méretű kép megtekintéséhez)
Miután frissítette a GetProducts() metódust az új lekérdezés használatára, a DataTable két új oszlopot fog tartalmazni: CategoryName és SupplierName.
30. ábra: A Products DataTable két új oszlopot tartalmaz
Szánjon egy kis időt a SELECT záradék frissítésére a GetProductsByCategoryID(categoryID) metódusban is.
Ha a GetProducts()SELECTfüggvényt JOIN szintaxissal frissíti, az Adatkészlet-tervező nem fogja tudni automatikusan létrehozni az adatbázisadatok közvetlen adatbázis-mintával történő beszúrására, frissítésére és törlésére szolgáló metódusokat. Ehelyett manuálisan kell létrehoznia őket, hasonlóan az InsertProduct metódushoz, mint az oktatóanyag korábbi részében. Emellett manuálisan kell megadnia az InsertCommand, UpdateCommand és DeleteCommand tulajdonságértékeket, ha a kötegfrissítési mintát szeretné használni.
A fennmaradó tábladapterek hozzáadása
Eddig csak egyetlen TableAdapter használatával foglalkoztunk egyetlen adatbázistábla esetében. A Northwind-adatbázis azonban számos kapcsolódó táblát tartalmaz, amelyekkel együtt kell dolgoznunk a webalkalmazásban. A gépelt adatkészletek több kapcsolódó adattáblát is tartalmazhatnak. Ezért a DAL elvégzéséhez hozzá kell adnunk DataTables-t az oktatóanyagokban használt többi táblához. Ha új TableAdaptert szeretne hozzáadni egy gépelt adathalmazhoz, nyissa meg az Adathalmaz-tervezőt, kattintson a jobb gombbal a Tervezőben, és válassza a Hozzáadás /TableAdapter lehetőséget. Ez létrehoz egy új DataTable-t és TableAdapter-t, majd végigvezet annak a varázslónak a folyamatán, amelyet korábban megvizsgáltunk ebben az oktatóanyagban.
Az alábbi lekérdezések használatával néhány perc alatt létrehozhatja a következő TableAdapters és metódusokat. Vegye figyelembe, hogy a ProductsTableAdapter lekérdezései tartalmazzák az egyes termékek kategóriáinak és szállítói nevének megragadásához használt al lekérdezéseket. Ezen kívül, ha figyelemmel kísérte a folyamatot, már hozzáadta a ProductsTableAdapter osztály GetProducts() és GetProductsByCategoryID(categoryID) metódusait.
TermékekAsztalAdapter
Szerezz termékeket:
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
KategóriákAsztaladapter
Kap Kategóriák:
SELECT CategoryID, CategoryName, Description FROM Categories
GetCategoryByCategoryID:
SELECT CategoryID, CategoryName, Description FROM Categories WHERE CategoryID = @CategoryID
BeszállítókTableAdapter
Szerezze be a beszállítókat:
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
AlkalmazottakAsztaladapter
Kap alkalmazottakat:
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
31. ábra: Az adathalmaz-tervező a négy táblaadapter hozzáadása után (kattintson ide a teljes méretű kép megtekintéséhez)
Egyéni kód hozzáadása a DAL-hoz
A gépelt adatkészlethez hozzáadott TableAdapterek és DataTable-ok XML-sémadefiníciós fájlként (Northwind.xsd) jelennek meg. A sémainformációk megtekintéséhez kattintson a jobb gombbal a Northwind.xsd fájlra a Megoldáskezelőben, és válassza a Kód megtekintése parancsot.
32. ábra: A Northwinds typed DataSet XML-sémadefiníciós (XSD) fájlja (ide kattintva megtekintheti a teljes méretű képet)
A sémainformációkat tervezési időben fordítják le C# vagy Visual Basic kódra, amikor a projektet fordítják, vagy futásidőben, ha szükséges. Ekkor a hibakeresővel végig lehet lépkedni rajta. Az automatikusan létrehozott kód megtekintéséhez nyissa meg az Osztály nézetet, és részletezse le a TableAdapter vagy a Typed DataSet osztályt. Ha nem látja az Osztály nézetet a képernyőn, nyissa meg a Nézet menüt, és válassza ki onnan, vagy nyomja le a Ctrl+Shift+C billentyűkombinációt. Az Osztálynézetben megtekintheti a Gépelt adatkészlet és a TableAdapter osztály tulajdonságait, metódusait és eseményeit. Egy adott metódus kódjának megtekintéséhez kattintson duplán a metódus nevére az Osztály nézetben, vagy kattintson rá a jobb gombbal, és válassza az Ugrás a definícióra parancsot.
33. ábra: Az automatikusan létrehozott kód vizsgálata az Ugrás definícióra lehetőség kiválasztásával az osztálynézetből
Bár az automatikusan létrehozott kód nagyszerű időt takaríthat meg, a kód gyakran nagyon általános, és testre kell szabni az alkalmazás egyedi igényeinek megfelelően. Az automatikusan létrehozott kód kiterjesztésének kockázata azonban az, hogy a kódot létrehozó eszköz dönthet úgy, hogy ideje "újragenerálni" és felülírni a testreszabásokat. A .NET 2.0 új részleges osztálykoncepciójával egyszerűen feloszthat egy osztályt több fájlra. Így saját metódusokat, tulajdonságokat és eseményeket adhatunk hozzá az automatikusan létrehozott osztályokhoz anélkül, hogy a Visual Studio felülírja a testreszabásainkat.
A DAL testreszabásának bemutatásához adjunk hozzá egy GetProducts() metódust a SuppliersRow osztályhoz. A SuppliersRow osztály egyetlen rekordot jelöl a Szállítók táblában; minden szállító nullát tud szolgáltatni számos termékhez, így a GetProducts() a megadott szállító termékeit adja vissza. Ehhez hozzon létre egy új osztályfájlt a App_Codenevű SuppliersRow.cs mappában, és adja hozzá a következő kódot:
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);
}
}
}
Ez a részleges osztály arra utasítja a fordítót, hogy a Northwind.SuppliersRow osztály létrehozásakor tartalmazza az imént definiált GetProducts() metódust. Ha elkészíti a projektet, majd visszatér az Osztály nézethez, a GetProducts() mostantól a Northwind.SuppliersRow metódusaként jelenik meg.
34. ábra: A GetProducts() metódus most a Northwind.SuppliersRow osztály része
A GetProducts() metódus mostantól egy adott szállító termékkészletének számbavételére használható, ahogy az alábbi kód is mutatja:
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>");
}
Ezek az adatok bármelyik ASP.NET adatvezérlőben megjeleníthetők. Az alábbi oldal egy GridView vezérlőt használ két mezővel:
- Egy BoundField, amely megjeleníti az egyes szállítók nevét, és
- Olyan TemplateField, amely tartalmaz egy felsorolásjeles vezérlőt, amely az egyes szállítók GetProducts() metódusa által visszaadott eredményekhez van kötve.
Megvizsgáljuk, hogyan jeleníthetők meg az ilyen részletes jelentések a jövőbeli oktatóanyagokban. Ez a példa egyelőre a Northwind.SuppliersRow osztályhoz hozzáadott egyéni módszer használatával szemlélteti.
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();
}
}
35. ábra: A szállító cégneve szerepel a bal oldali oszlopban, a termékek a jobb oldalon (kattintson ide a teljes méretű kép megtekintéséhez)
Összefoglalás
Webalkalmazás fejlesztésekor a DAL, vagyis az adat-hozzáférési réteg létrehozásának az első lépések között kell szerepelnie, még mielőtt elkezdené létrehozni a megjelenítési réteget. A Visual Studióval a beírt adatkészleteken alapuló DAL létrehozása olyan feladat, amely 10–15 perc alatt elvégezhető kódsor írása nélkül. Az előremutató oktatóanyagok erre a DAL-ra épülnek. A következő oktatóanyagban számos üzleti szabályt határozunk meg, és bemutatjuk, hogyan implementálhatók egy külön üzleti logikai rétegben.
Boldog programozást!
További olvasás
Az oktatóanyagban tárgyalt témakörökről az alábbi forrásokban talál további információt:
- DAL készítése szigorúan típusos TableAdapterek és DataTable-ök használatával a VS 2005-ben és az ASP.NET 2.0-ban
- Adatréteg-összetevők tervezése és adatok továbbítása rétegeken keresztül
- Konfigurációs információk titkosítása ASP.NET 2.0-s alkalmazásokban
- TableAdapter – áttekintés
- Gépelt adatkészlet használata
- Az Strongly-Typed Data Access használata a Visual Studio 2005-ben és ASP.NET 2.0-s verzióban
- TableAdapter metódusok kiterjesztése
Oktatóvideó az oktatóanyagban szereplő témakörökről
- Adatelérési rétegek ASP.NET alkalmazásokban
- Adathalmaz manuális kötése az adatkerethez
- Adatkészletek és szűrők használata ASP-alkalmazásból
Tudnivalók a szerzőről
Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Tanulja Meg Az ASP.NET 2.0-t 24 Óra Alatt. Ő itt elérhető mitchell@4GuysFromRolla.com.
Külön köszönet
Ezt az oktatóanyag-sorozatot sok hasznos véleményező áttekintette. Az oktatóanyag fő véleményezői Ron Green, Hilton Giesenow, Dennis Patterson, Liz Shulok, Abel Gomez és Carlos Santos voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.