Megosztás a következőn keresztül:


Adatelérési réteg (VB) létrehozása

által Scott Mitchell

PDF letöltése

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.

Új fájl System-Based webhely létrehozása

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_Datamappá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.

Kapcsolat hozzáadása az adatbázis-kiszolgáló Northwind-adatbázisához

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 ProductsCategories , 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.

Minden adatelérési kód a DAL-ra van delegálva

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

Új adathalmaz hozzáadása a projekthez

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.

A Northwind-adatbázis kiválasztása a Drop-Down listából

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.

A kapcsolati sztring mentése a Web.config-nál

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.

Adatok lekérdezése alkalmi SQL-utasítás használatával

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 :

Írja be az SQL-lekérdezést a szövegmezőbe

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.

A lekérdezés grafikus létrehozása a Lekérdezésszerkesztőn keresztül

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.

Csak a beszúrási, frissítési és törlési utasítások generálása lehetőséget válassza

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.

A metódus nevének módosítása GetData-ról GetProducts-ra

11. ábra: A metódus nevének GetDataGetProducts 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.

A Products DataTable és a ProductsTableAdapter hozzáadva lett a tipizált adatkészlethez

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

A termékek listája megjelenik egy GridView-ban

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.

Right-Click a TableAdapterben, é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 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.

Adjon meg egy lekérdezést, amely csak adott kategóriában lévő termékeket ad vissza

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.

Válassza ki a TableAdapter metódusok nevét

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.

A termékek most már lekérdezhetők kategória szerint

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.

Az italkategóriába tartozó termékek láthatók

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

A Beverages kategóriában található termékek megjelennek

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, UPDATEvagy 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.

Minden beszúrási, frissítési és törlési kérés azonnal el lesz küldve az adatbázisba

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.

A rendszer az összes módosítást szinkronizálja az adatbázissal a frissítési módszer meghívásakor

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.)

A TableAdapter insertCommand, UpdateCommand és DeleteCommand tulajdonsággal rendelkezik

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.

Az INSERT, UPDATE és DELETE utasítások konfigurálása a Lekérdezésszerkesztőben

24. ábra: Konfigurálja a INSERTleké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.

Új sor hozzáadása a Termékek táblához metódus létrehozása

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 InsertCommandCommandText-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.

A lekérdezés bővítése a SCOPE_IDENTITY() érték visszaadásához

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.

Az új metódus nevének beállítása InsertProduct értékre

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

Az ExecuteMode tulajdonság módosítása skalárisra

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

A GetProducts() metódus SELECT utasításának frissítése

29. ábra: A metódus utasításának SELECTGetProducts() 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.

A Products DataTable két új oszlopot tartalmaz

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
      

Az adathalmaz-tervező a négy táblaadapter hozzáadása után

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.

A Northwinds típusú adatkészlet XML-sémadefiníciós (XSD) fájlja

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.

Vizsgálja meg az automatikusan létrehozott kódot az Ugrás a definícióhoz lehetőség kiválasztásával az osztálynézetből

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.

A GetProducts() metódus most az Northwind.SuppliersRow osztály része.

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

A szállító cégneve a bal oldali oszlopban, a termékek a jobb oldalon található

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:

Oktatóvideó az oktatóanyagban szereplő témakörökrő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.