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.)
Ezekben az oktatóanyagokban 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 fájljában Web.config
. 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 Visual Basicre.
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, egy App_Data
mappával és egy fájllal Web.config
.
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 aApp_Data
mappában
Ha nem rendelkezik SQL Server 2000 vagy 2005 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.MDF
) található Northwind-adatbázis SQL Server 2005 Express Edition verzióját.
A rendszer automatikusan hozzáad egy, a App_Data
mappában elhelyezett adatbázist a Kiszolgálókezelőhöz. 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 tartalmazhat Microsoft Access-fájlokat .mdb
is, 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, bármikor telepítheti a Northwind Traders adatbázisát és alkalmazásait , és beugrahat a App_Data
könyvtárba. 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, például az adatbázis kapcsolatának létrehozására, a SELECT
, INSERT
, UPDATE
és DELETE
parancsok kiadására vonatkozó összes kód a DAL-ban kell, hogy legyen. 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 olyan táblákat is tárol Products
Categories
, 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ót ad vissza -
GetProductsByCategoryID(categoryID)
, amely egy adott kategóriához tartozó összes terméket visszaadja -
GetProductByProductID(productID)
, amely egy adott termékre vonatkozó információkat ad 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 lazán gépelt DataTable-ból szeretne elérni, a következő szintaxist kell használnia: DataTable.Rows(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ágokként implementálják, így a következő kód jelenik meg: DataTable.Rows(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 az Adathalmaz lehetőséget a sablonok listájából, és nevezze el.Northwind.xsd
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 Adathalmazt a mappához, válassza az App_Code
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.
Products
A DataTable esetében a TableAdapter tartalmazza a metódusokatGetProducts()
, GetProductByCategoryID(categoryID)
é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 karakterláncot a konfigurációs fájlban a <connectionStrings>
szakaszba, 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ának használatával, ami sokkal ideálisabb rendszergazdák számára.
6. ábra: Mentse a kapcsolati karakterláncot Web.config
(Kattintson ide 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 tábla összes oszlopát és sorát visszaadja Products
:
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 metódusával
Fill()
implementálja 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 is a következőre GetProducts
: .
Ha be van jelölve, a "GenerateDBDirectMethods" jelölőnégyzet a TableAdapter számára létrehozza a Insert()
, Update()
és Delete()
metódusokat. Ha nem bejelöli ezt a beállítást, az összes frissítést a TableAdapter egyetlen Update()
metódusával kell elvégezni, 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 GetData
GetProducts
módosítása (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 oszlopainak listáját (ProductID
, ProductName
, és így tovább), valamint a ProductsTableAdapter
metódusait (Fill()
és GetProducts()
) is láthatja.
12. ábra: A Products
DataTable, és ProductsTableAdapter
hozzá lett adva a gépelt adatkészlethez (kattintson ide a teljes méretű kép megtekintéséhez)
Ezen a ponton van egy típusos adatkészlet egyetlen DataTable-tal (Northwind.Products
) és egy erősen típusos DataAdapter osztállyal (NorthwindTableAdapters.ProductsTableAdapter
), amelynek van egy GetProducts()
metódusa. Ezek az objektumok a következő kódból származó összes termék listájának elérésére használhatók:
Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products as Northwind.ProductsDataTable
products = productsAdapter.GetProducts()
For Each productRow As Northwind.ProductsRow In products
Response.Write("Product: " & productRow.ProductName & "<br />")
Next
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 szemlélteti, hogy a GetProducts()
metódus által visszaadott DataTable egy GridView-hoz való kötését mutatja be mindössze három sornyi kódban az Page_Load
eseménykezelőben.
AllProducts.aspx
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="AllProducts.aspx.vb"
Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>View All Products in a GridView</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>
All Products</h1>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
AllProducts.aspx.vb
Imports NorthwindTableAdapters
Partial Class AllProducts
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Dim productsAdapter As New ProductsTableAdapter
GridView1.DataSource = productsAdapter.GetProducts()
GridView1.DataBind()
End Sub
End Class
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 eseménykezelőjében Page_Load
, a jövőbeli oktatóanyagokban azt vizsgáljuk meg, hogyan használhatja 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 ProductsTableAdapter
az osztály csak egy metódussal rendelkezik, GetProducts()
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 metódust GetProductsByCategoryID(categoryID)
. Ha új metódust szeretne hozzáadni a DAL-hoz, térjen vissza az Adatkészlet-tervezőhöz, kattintson a jobb gombbal a szakaszban, és válassza a ProductsTableAdapter
Lekérdezés hozzáadása parancsot.
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 olyan utasítást SELECT
szeretnénk írni, amely sorokat ad vissza.
Válassza a sorokat visszaadó SELECT utasítás létrehozását.
15. ábra: Sorok visszaadására szolgáló utasítás létrehozása SELECT
(ide kattintva megtekintheti a teljes méretű képet)
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, ugyanezt SELECT
az állítást GetProducts()
használom, de a következő záradékot adjuk WHERE
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. Kitöltési minta esetében változtassuk meg a nevet FillByCategoryID
, és a DataTable visszatérési mintát (a GetX
metódusokat) használjuk a GetProductsByCategoryID
-ra történő visszatéréshez.
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 kis időt arra, hogy ugyanazt a technikát használva adjon hozzá egy metódust GetProductByProductID(productID)
.
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)
GetProductsByCategoryID(categoryID)
A DAL metódusával mostantól létrehozhatunk egy ASP.NET lapot, amely csak azokat a termékeket jeleníti meg egy adott kategóriában. Az alábbi példa az Italok kategóriájába tartozó összes terméket mutatja, amelyek CategoryID
értéke 1.
Beverages.aspx
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Beverages.aspx.vb"
Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Beverages</h1>
<p>
<asp:GridView ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
Beverages.aspx.vb
Imports NorthwindTableAdapters
Partial Class Beverages
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Dim productsAdapter As New ProductsTableAdapter
GridView1.DataSource =
productsAdapter.GetProductsByCategoryID(1)
GridView1.DataBind()
End Sub
End Class
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, olyan metódusok létrehozásával jár, 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áblázat ezt a mintát használja, a törlési módszer egy egész szám paraméterként kapja meg, amely a törölni kívánt rekord indexét ProductID
jelöli, míg a beszúrási módszer egy sztringet a ProductName
-hez, egy decimálist a UnitPrice
-hez, egy egész számot a UnitsOnStock
-hez kap, és így tovább.
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 elemné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
tábla egy metódust Update()
tartalmaz, amely implementálja a kötegfrissítési mintát. A TableAdapter egy olyan metódust Update()
tartalmaz, amely átadható a Gépelt adatkészletnek, egy erősen gépelt DataTable-nak vagy egy vagy több DataRow-nak. Ha először létrehozta a TableAdaptert és bejelölte a "GenerateDBDirectMethods" jelölőnégyzetet, az adatbázis közvetlen mintája is automatikusan megvalósul a Insert()
, Update()
, és Delete()
metódusok használatával.
Mindkét adatmódosítási minta a TableAdapter InsertCommand
, UpdateCommand
és DeleteCommand
tulajdonságok használatával végrehajtja a INSERT
, UPDATE
és DELETE
parancsokat az adatbázisnak. Az adattkészlet-tervezőben kattintson a TableAdapter elemre, majd lépjen a Tulajdonságok ablakra, ahol megvizsgálhatja és módosíthatja a InsertCommand
, UpdateCommand
, és DeleteCommand
tulajdonságokat. (Győződjön meg arról, hogy a TableAdaptert választotta ki, és hogy az ProductsTableAdapter
objektum a Tulajdonságok ablak legördülő listájában van kiválasztva.)
23. ábra: A TableAdapter rendelkezik InsertCommand
, UpdateCommand
és DeleteCommand
Tulajdonságok (ide kattintva megtekintheti a teljes méretű képet)
Az adatbázis parancstulajdonságainak vizsgálatához vagy módosításához kattintson az CommandText
altulajdonságra, amely megjeleníti a Lekérdezésszerkesztőt.
24. ábra: Konfigurálja a INSERT
lekérdezésszerkesztőben a , UPDATE
és DELETE
az utasításokat (kattintson ide a teljes méretű kép megtekintéséhez)
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:
Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products As Northwind.ProductsDataTable = productsAdapter.GetProducts()
For Each product As Northwind.ProductsRow In products
If Not product.Discontinued AndAlso product.UnitsInStock <= 25 Then
product.UnitPrice *= 2
End if
Next
productsAdapter.Update(products)
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:
Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
productsAdapter.Delete(3)
productsAdapter.Update( _
"Chai", 1, 1, "10 boxes x 20 bags", 18.0, 39, 15, 10, false, 1)
productsAdapter.Insert( _
"New Product", 1, 1, "12 tins per carton", 14.95, 15, 0, 10, false)
Egyéni beszúrási, frissítési és törlési metódusok létrehozása
A Insert()
közvetlen ADATBÁZIS-metódus által létrehozott , 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, IntelliSense segítsége nélkül nem különösebben egyértelmű, hogy melyik táblaoszlop felel meg az egyes bemeneti paramétereknek a Products
és Update()
metódusokhoz. Előfordulhat, hogy csak egy vagy két oszlopot szeretnénk frissíteni, vagy olyan testreszabott Insert()
módszert szeretnénk, amely esetleg az újonnan beszúrt rekord IDENTITY
(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
értékét. Ezért válassza azt, hogy készít egy INSERT
lekérdezést.
25. ábra: Új sor hozzáadása a táblázathoz metódus létrehozása (Products
teljes méretű képet)
A következő képernyőn megjelenik a InsertCommand
CommandText
-je. Bővítse ezt a lekérdezést úgy, hogy a SELECT SCOPE_IDENTITY()
-t adja hozzá a végére; ez visszaadja annak az identitásértékét, amelyet legutóbb adtak hozzá ugyanabban a hatókörben egy IDENTITY
oszlophoz. (További információt a műszaki dokumentációban talál, amelyből SCOPE_IDENTITY()
megtudhatja, hogy miért érdemes SCOPE_IDENTITY() a @@IDENTITY helyett használni.) Győződjön meg arról, hogy az INSERT
utasítást pontosvesszővel fejezi be, mielőtt hozzáadná a SELECT
utasítást.
26. ábra: A lekérdezés bővítése az 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 metódust InsertProduct
.
27. ábra: Állítsa be az új metódus nevét InsertProduct
(kattintson ide a teljes méretű kép megtekintéséhez)
Amikor visszatér a DataSet Designerhez, látni fogja, hogy az ProductsTableAdapter
új metódust tartalmaz. InsertProduct
Ha ez az új metódus nem rendelkezik paraméterrel a Products
táblázat egyes oszlopaihoz, akkor valószínűleg elfelejtette félbekezdeni az INSERT
utasítást. Konfigurálja a InsertProduct
metódust, és győződjön meg arról, hogy a pontosvessző elhatárolja az INSERT
és a SELECT
utasításokat.
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 a InsertProduct
metódus a lekérdezés által visszaadott értéket adja vissza, nem az érintett sorok számát. Ehhez módosítsa a InsertProduct
metódus tulajdonságát ExecuteMode
a következőre Scalar
: .
28. ábra: Módosítsa a ExecuteMode
tulajdonságot a következőre Scalar
(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:
Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim new_productID As Integer = Convert.ToInt32(productsAdapter.InsertProduct( _
"New Product", 1, 1, "12 tins per carton", 14.95, 10, 0, 10, false))
productsAdapter.Delete(new_productID)
5. lépés: Az adatelérési réteg befejezése
Vegye figyelembe, hogy az ProductsTableAdapters
osztály visszaadja a CategoryID
és SupplierID
értékeket a Products
táblából, de nem tartalmazza a CategoryName
oszlopot a Categories
táblából vagy a CompanyName
oszlopot a Suppliers
táblából, annak ellenére, hogy ezek valószínűleg azok az oszlopok, amelyeket a termékinformációk megjelenítésekor látni szeretnénk. Bővíthetjük a TableAdapter kezdeti metódusát, hogy tartalmazza mind az GetProducts()
, mind a CategoryName
oszlop értékeit, 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 záradékban szereplő allekérdezések nem befolyásolják az automatikusan létrehozott beszúrási, frissítési és törlési SELECT
módszereket. Ha a lekérdezéseket al-lekérdezésekként adjuk hozzá Categories
és Suppliers
-hez ahelyett, hogy JOIN
-k lennének, elkerülhetjük, hogy újra kelljen dolgoznunk azokat a metódusokat az adatok módosításához. Kattintson a jobb gombbal a GetProducts()
metódusra a ProductsTableAdapter
-ben, és válassza a Konfigurálás parancsot. 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: A metódus utasításának SELECT
GetProducts()
frissítése (kattintson ide a teljes méretű kép megtekintéséhez)
Az új lekérdezés használatára szolgáló metódus frissítése GetProducts()
után a DataTable két új oszlopot tartalmaz: 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(z) GetProductsByCategoryID(categoryID)
metódusban is.
Ha frissíti a GetProducts()
SELECT
a JOIN
szintaxist használva, az Adatkészlettervező nem fogja tudni automatikusan létrehozni az adatbázisadatok beszúrására, frissítésére és törlésére szolgáló módszereket, a DB direkt mintát használva. Ehelyett manuálisan kell létrehoznia ezeket, úgy, mint ahogy az InsertProduct
módszerrel tettük korábban ebben az oktatóanyagban. Emellett manuálisan kell megadnia a InsertCommand
, UpdateCommand
, és DeleteCommand
tulajdonságok értékeit, 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ések tartalmazzák az egyes termékek kategóriáinak és szállítói nevének lekérdezéséhez szükséges al-lekérdezéseket. Emellett, ha követte a műveletet, 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 Typed DataSethez hozzáadott TableAdapterek és DataTable-ök XML-séma-definíciós fájlként (Northwind.xsd
) vannak kifejezve. A sémainformációk megtekintéséhez kattintson a jobb gombbal a fájlra a Northwind.xsd
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 metódust GetProducts()
az SuppliersRow
osztályhoz. Az SuppliersRow
osztály egyetlen rekordot jelöl a Suppliers
táblában; minden szállító nullát tud szolgáltatni számos termékhez, ezért GetProducts()
a megadott szállító termékeit adja vissza. Ehhez hozzon létre egy új osztályfájlt a App_Code
nevesített SuppliersRow.vb
mappában, és adja hozzá a következő kódot:
Imports NorthwindTableAdapters
Partial Public Class Northwind
Partial Public Class SuppliersRow
Public Function GetProducts() As Northwind.ProductsDataTable
Dim productsAdapter As New ProductsTableAdapter
Return productsAdapter.GetProductsBySupplierID(Me.SupplierID)
End Function
End Class
End Class
A részleges osztály úgy utasítja a fordítót, hogy az Northwind.SuppliersRow
osztály összeállításakor vegye bele az imént definiált GetProducts()
metódust. Ha elkészíti a projektet, majd visszatér az Osztály nézethez, látni fogja, hogy a GetProducts()
most Northwind.SuppliersRow
egyik metódusaként szerepel.
34. ábra: A GetProducts()
metódus most már az Northwind.SuppliersRow
osztály része
Ez a GetProducts()
módszer 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:
Dim suppliersAdapter As New NorthwindTableAdapters.SuppliersTableAdapter()
Dim suppliers As Northwind.SuppliersDataTable = suppliersAdapter.GetSuppliers()
For Each supplier As Northwind.SuppliersRow In suppliers
Response.Write("Supplier: " & supplier.CompanyName)
Response.Write("<ul>")
Dim products As Northwind.ProductsDataTable = supplier.GetProducts()
For Each product As Northwind.ProductsRow In products
Response.Write("<li>" & product.ProductName & "</li>")
Next
Response.Write("</ul><p> </p>")
Next
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 egy listajeles vezérlőt tartalmaz, és 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 az osztályhoz Northwind.SuppliersRow
hozzáadott egyéni metódussal való szemléltetéshez készült.
SuppliersAndProducts.aspx
<%@ Page Language="VB" CodeFile="SuppliersAndProducts.aspx.vb"
AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>
Suppliers and Their Products</h1>
<p>
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False"
CssClass="DataWebControlStyle">
<HeaderStyle CssClass="HeaderStyle" />
<AlternatingRowStyle CssClass="AlternatingRowStyle" />
<Columns>
<asp:BoundField DataField="CompanyName"
HeaderText="Supplier" />
<asp:TemplateField HeaderText="Products">
<ItemTemplate>
<asp:BulletedList ID="BulletedList1"
runat="server" DataSource="<%# CType(CType(Container.DataItem, System.Data.DataRowView).Row, Northwind.SuppliersRow).GetProducts() %>"
DataTextField="ProductName">
</asp:BulletedList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
SuppliersAndProducts.aspx.vb
Imports NorthwindTableAdapters
Partial Class SuppliersAndProducts
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Dim suppliersAdapter As New SuppliersTableAdapter
GridView1.DataSource = suppliersAdapter.GetSuppliers()
GridView1.DataBind()
End Sub
End Class
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 Tanuld meg ASP.NET 2.0 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.