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


A TableAdapter frissítése JOIN-ek használatára (C#)

által Scott Mitchell

PDF letöltése

Adatbázis használatakor gyakori, hogy több táblára kiterjedő adatokat kérünk le. Ha két különböző táblából szeretne adatokat lekérni, használhat korrelált alqueryt vagy JOIN műveletet. Ebben az oktatóanyagban összehasonlítjuk a korrelált al lekérdezéseket és a JOIN szintaxist, mielőtt megvizsgálnánk, hogyan hozhat létre olyan TableAdaptert, amely tartalmazza a JOIN függvényt a fő lekérdezésben.

Bevezetés

A relációs adatbázisokban gyakran több táblában vannak elosztva azok az adatok, amelyeken dolgozni szeretnénk. Például a termékinformációk megjelenítésekor valószínűleg minden egyes termékkategóriát és szállító nevét fel szeretnénk sorolni. A Products tábla CategoryID és SupplierID értékekkel rendelkezik, de a tényleges kategória- és szállítónevek a Categories és Suppliers táblákban vannak.

Ha egy másik, kapcsolódó táblából szeretne adatokat lekérni, használhat korrelált al lekérdezéseket vagy JOINs-eket. A korrelált részkérdezések olyan beágyazott SELECT lekérdezések, amelyek a külső lekérdezés oszlopaira hivatkoznak. Az Adatelérési réteg létrehozása oktatóanyagban például két korrelált al lekérdezést használtunk az ProductsTableAdapter s fő lekérdezésben az egyes termékek kategória- és szállítóneveinek visszaadásához. Az A JOIN egy SQL-szerkezet, amely két különböző tábla kapcsolódó sorait egyesíti. A JOIN a Adatok lekérdezése az SqlDataSource Control oktatóanyaggal oktatóanyagban használtuk, hogy kategóriainformációkat jelenítsünk meg az egyes termékek mellett.

Azért tartózkodtunk a JOIN TableAdapterekkel való használatától, mert a TableAdapter varázslóban korlátozások vannak a megfelelő INSERT, UPDATE és DELETE utasítások automatikus létrehozására. Pontosabban, ha a TableAdapter fő lekérdezése tartalmaz s-t JOIN , a TableAdapter nem tudja automatikusan létrehozni az alkalmi SQL-utasításokat vagy a tárolt eljárásokat annak InsertCommand, UpdateCommandés DeleteCommand tulajdonságai számára.

Ebben az oktatóanyagban röviden összehasonlítjuk és szembeállítjuk a korrelált al-lekérdezéseket és JOIN s-eket, mielőtt megvizsgálnánk, hogyan hozhatunk létre olyan TableAdaptert, amely tartalmazza a JOIN-eket a fő lekérdezésében.

Korrelált al-lekérdezések összehasonlítása és különbségeiJOIN

Ne feledje, hogy a ProductsTableAdapter DataSet-et, amelyet az első oktatóanyagban Northwind hoztak létre, korrelált al-lekérdezéseket használ az egyes termékeknek megfelelő kategóriák és szállítók nevének visszaadásához. Az ProductsTableAdapter s fő lekérdezés alább látható.

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 két korrelált al lekérdezés – (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID) és (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) – olyan lekérdezések SELECT , amelyek termékenként egyetlen értéket adnak vissza a külső SELECT utasítás oszloplistájának további oszlopaként.

Másik lehetőségként a JOIN termék szállítójának és kategórianevének visszaadására is használható. A következő lekérdezés ugyanazt a kimenetet adja vissza, mint a fenti, de az al lekérdezések helyett az s értéket használja JOIN :

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

A JOIN rekordok egyesítése az egyik táblából egy másik táblából származó rekordokkal bizonyos feltételek alapján. A fenti lekérdezésben például az SQL Server arra utasítja, LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID hogy egyesítse az egyes termékrekordokat azzal a kategóriarekorddal, amelynek CategoryID értéke megegyezik a termék s CategoryID értékével. Az egyesített eredmény lehetővé teszi, hogy az egyes termékekhez (például CategoryName) tartozó kategóriamezőkkel működjünk együtt.

Megjegyzés:

JOIN Az s-eket gyakran használják relációs adatbázisokból származó adatok lekérdezéséhez. Ha még csak most ismerkedik a JOIN szintaxissal, vagy egy kicsit felfrissíteni szeretné a használatát, azt javaslom, hogy tekintse meg az SQL Join oktatóanyagot a W3 Schools oldalán. Érdemes elolvasni az JOINSQL Books Online Alapjai és részkérdések alapjai című szakaszát is.

Mivel JOIN s és korrelált alkérdések egyaránt használhatók a kapcsolódó adatok más táblákból való lekérésére, sok fejlesztő töri a fejét, és azon tűnődik, hogy melyik megközelítést kell használnia. Az összes SQL guru, akivel beszéltem, nagyjából ugyanazt mondta, hogy teljesítmény szempontjából nem igazán számít, mivel az SQL Server nagyjából azonos végrehajtási terveket fog létrehozni. A tanácsuk tehát az, hogy azt a technikát használják, amellyel Ön és csapata a legkényelmesebb. Érdemes megjegyezni, hogy miután átadták ezt a tanácsot, ezek a szakértők azonnal kifejezik, hogy JOIN-t részesítik előnyben a korrelált al-lekérdezések helyett.

Ha adatelérési réteget hoz létre gépelt adathalmazok használatával, az eszközök jobban működnek az al lekérdezések használatakor. A TableAdapter varázsló nem fogja automatikusan létrehozni a megfelelő INSERT, UPDATE és DELETE utasításokat, ha a fő lekérdezés bármilyen JOIN-t tartalmaz, de automatikusan létrehozza ezeket az utasításokat, amikor korrelált al-lekérdezéseket használnak.

Ennek a hiányosságnak a feltárásához hozzon létre egy ideiglenes, gépelt adatkészletet a ~/App_Code/DAL mappában. A TableAdapter Configuration varázsló során válassza az alkalmi SQL-utasítások használatát, és adja meg a következő SELECT lekérdezést (lásd az 1. ábrát):

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

Képernyőkép a TableAdaptor konfigurációs varázsló ablakáról, amelyen be van írva egy JOIN-t tartalmazó lekérdezés.

1. ábra: Adjon meg egy fő lekérdezést, amely tartalmazza az s-t JOIN (kattintson ide a teljes méretű kép megtekintéséhez)

Alapértelmezés szerint a TableAdapter a fő lekérdezés alapján automatikusan létrehoz INSERT, UPDATE, és DELETE utasításokat. Ha a Speciális gombra kattint, láthatja, hogy ez a funkció engedélyezve van. Ennek ellenére a TableAdapter nem fogja tudni létrehozni a INSERT, UPDATE, és DELETE utasításokat, mert a fő lekérdezés tartalmaz egy JOIN.

Képernyőkép a Speciális beállítások ablakról, amelyen be van jelölve a Beszúrás, frissítés és törlés utasítás létrehozása jelölőnégyzet.

2. ábra: Adjon meg egy fő lekérdezést, amely tartalmazza az s-t JOIN

A varázsló befejezéséhez kattintson a Befejezés gombra. Ezen a ponton a DataSet tervezője egyetlen TableAdaptert fog tartalmazni egy DataTable-lel, amely oszlopokat tartalmaz a SELECT lekérdezés oszloplistájában visszaadott mezők mindegyikéhez. Ez magában foglalja az CategoryName és SupplierName, ahogy a 3. ábra mutatja.

A DataTable tartalmaz egy oszlopot az oszloplistában visszaadott minden mezőhöz

3. ábra: A DataTable tartalmaz egy oszlopot az oszloplistában visszaadott mezőkhöz

Bár a DataTable rendelkezik a megfelelő oszlopokkal, a TableAdapter nem rendelkezik a hozzá tartozó értékekkel InsertCommandés UpdateCommandDeleteCommand tulajdonságokkal. Ennek megerősítéséhez kattintson a Tervező TableAdapter elemére, majd a Tulajdonságok ablakra. Itt láthatja, hogy a InsertCommand, UpdateCommandés DeleteCommand a tulajdonságok (Nincs) értékre vannak állítva.

Az InsertCommand, az UpdateCommand és a DeleteCommand tulajdonságai (Nincs) értékre vannak beállítva

4. ábra: A InsertCommand, UpdateCommand, és DeleteCommand tulajdonságok értéke (Nincs) (Ide kattintva megtekintheti a teljes méretű képet)

Ennek a hiányosságnak a megkerüléséhez a Tulajdonságok ablakban manuálisan adhatjuk meg a , InsertCommandés a UpdateCommandtulajdonságok SQL-utasításait és DeleteCommand paramétereit. A TableAdapter fő lekérdezését úgy is beállíthatja, hogy ne tartalmazzon egyetlen JOIN elemet sem. Ez lehetővé teszi, hogy a INSERT, UPDATEés DELETE az utasítások automatikusan létrejönnek számunkra. A varázsló befejezése után manuálisan frissíthetjük a TableAdapter-eket SelectCommand a Tulajdonságok ablakból annak érdekében, hogy tartalmazza a szintaxist JOIN.

Bár ez a megközelítés működik, az ad-hoc SQL-lekérdezések használatakor nagyon érzékeny, mert bármikor, amikor a TableAdapter fő lekérdezése újrakonfigurálásra kerül a varázslón keresztül, az automatikusan létrehozott INSERT, UPDATE, és DELETE utasítások újra létrejönnek. Ez azt jelenti, hogy a később végrehajtott testreszabások elvesznek, ha a jobb gombbal a TableAdapterre kattintunk, a helyi menüben a Konfigurálás lehetőséget választjuk, és ismét befejezzük a varázslót.

A TableAdapter automatikusan létrehozott INSERT, UPDATEés DELETE utasítások törékenysége szerencsére csak alkalmi SQL-utasításokra korlátozódik. Ha a TableAdapter tárolt eljárásokat használ, testre szabhatja a SelectCommand, InsertCommand, UpdateCommandvagy DeleteCommand tárolt eljárásokat, és újra futtathatja a TableAdapter Konfiguráció varázslót anélkül, hogy attól kellene tartania, hogy a tárolt eljárások módosulnak.

A következő néhány lépésben létrehozunk egy TableAdaptert, amely kezdetben egy fő lekérdezést használ, amely kihagyja az összes JOIN s-t, hogy a megfelelő beszúrási, frissítési és törlési eljárások automatikusan létre legyenek hozva. Ezután frissítjük a SelectCommand-t úgy, hogy egy JOIN-t használjon, amely további oszlopokat ad vissza a kapcsolódó táblákból. Végül létrehozunk egy megfelelő Üzleti logikai réteg osztályt, és bemutatjuk a TableAdapter használatát egy ASP.NET weblapon.

1. lépés: A TableAdapter létrehozása egyszerűsített fő lekérdezés használatával

Ebben az oktatóanyagban hozzáadunk egy TableAdapter-t és egy erősen típusos DataTable-t a Employees táblához a NorthwindWithSprocs DataSet-ben. A Employees tábla egy ReportsTo mezőt tartalmaz, amely az alkalmazott vezetőjére vonatkozik. Például, az alkalmazott Anne Dodsworth ReportTo értéke 5, amely EmployeeID Steven Buchanané. Ezért Anne jelentést tesz Stevennek, a felettesének. Az egyes alkalmazottak ReportsTo értékének jelentésével együtt érdemes lehet lekérni a felettesük nevét is. Meg lehet valósítani egy JOIN segítségével. A JOIN használata a TableAdapter kezdeti létrehozásakor azonban megakadályozza azt, hogy a varázsló automatikusan létrehozza a beszúrási, frissítési és törlési funkciókat. Ezért először létrehozunk egy TableAdaptert, amelynek fő lekérdezése nem tartalmaz s-t JOIN . Ezután a 2. lépésben frissítjük a fő lekérdezés tárolt eljárását, hogy lekérjük a kezelő nevét egy JOIN.

Először nyissa meg a NorthwindWithSprocs DataSetet a ~/App_Code/DAL mappában. Kattintson a jobb gombbal a Tervezőre, válassza a helyi menüben a Hozzáadás lehetőséget, majd kattintson a TableAdapter menüelemre. Ezzel elindítja a TableAdapter Configuration varázslót. Az 5. ábrán látható módon a varázsló hozzon létre új tárolt eljárásokat, és kattintson a Tovább gombra. A TableAdapter varázsló használatával új tárolt eljárások létrehozásának frissítéséhez lásd a Típusos Adathalmaz TableAdapter-eihez Új tárolt eljárások létrehozása oktatóanyagot.

Válassza az Új tárolt eljárások létrehozása lehetőséget

5. ábra: Válassza az Új tárolt eljárások létrehozása lehetőséget (kattintson ide a teljes méretű kép megtekintéséhez)

A TableAdapter fő lekérdezéséhez használja a következő SELECT utasítást:

SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country
FROM Employees

Mivel ez a lekérdezés nem tartalmaz s-t JOIN , a TableAdapter varázsló automatikusan létrehozza a tárolt eljárásokat a megfelelő INSERT, UPDATEés DELETE utasításokkal, valamint egy tárolt eljárást a fő lekérdezés végrehajtásához.

Az alábbi lépés lehetővé teszi a TableAdapter tárolt eljárásainak elnevezését. Használja a Employees_Select, Employees_Insert, Employees_Update és Employees_Delete neveket a 6. ábrán látható módon.

A TableAdapter tárolt eljárásainak elnevezése

6. ábra: Nevezze el a TableAdapter tárolt eljárásait (kattintson ide a teljes méretű kép megtekintéséhez)

Az utolsó lépés arra kéri, hogy nevezze el a TableAdapter metódusait. Használja a Fill és GetEmployees metódusneveket. Ügyeljen arra is, hogy a Létrehozási metódusok jelölőnégyzet bejelölésével közvetlenül az adatbázisba (GenerateDBDirectMethods) küldjön frissítéseket.

Nevezze meg a TableAdapter metódusukat: Fill és GetEmployees

7. ábra: Nevezze el a TableAdapter metódusokat Fill és GetEmployees (kattintson ide a teljes méretű kép megtekintéséhez)

A varázsló befejezése után szánjon egy kis időt az adatbázisban tárolt eljárások vizsgálatára. Négy újat kell látnia: Employees_Select, Employees_Insert, Employees_Updateés Employees_Delete. Ezután vizsgálja meg a most létrehozott EmployeesDataTable és EmployeesTableAdapter elemeket. A DataTable a fő lekérdezés által visszaadott mezőkhöz tartalmaz egy oszlopot. Kattintson a TableAdapter elemre, majd lépjen a Tulajdonságok ablakra. Itt láthatja, hogy a InsertCommand, UpdateCommandés DeleteCommand a tulajdonságok megfelelően vannak konfigurálva a megfelelő tárolt eljárások meghívására.

A TableAdapter tartalmazza a beszúrási, frissítési és törlési képességeket

8. ábra: A TableAdapter tartalmazza a beszúrási, frissítési és törlési képességeket (ide kattintva megtekintheti a teljes méretű képet)

A tárolt eljárások beszúrása, frissítése és törlése automatikusan létrejön, és a InsertCommand, UpdateCommandés DeleteCommand a tulajdonságok megfelelően vannak konfigurálva, készen állunk arra, hogy testre szabjuk az SelectCommand s tárolt eljárást, hogy további információkat adjunk vissza az egyes alkalmazottak vezetőiről. Pontosabban, frissíteni kell a Employees_Select tárolt eljárást, hogy használja a JOIN, és visszaadja a kezelő FirstName és LastName értékeit. A tárolt eljárás frissítése után frissíteni kell a DataTable-t, hogy az tartalmazza ezeket a további oszlopokat. Ezt a két feladatot a 2. és a 3. lépésben fogjuk elvégezni.

2. lépés: A tárolt eljárás testreszabása annak érdekében, hogy tartalmazzon egyJOIN

Először nyissa meg a Kiszolgálókezelőt, fúrjon le a Northwind-adatbázis Tárolt eljárások mappájába, és nyissa meg a Employees_Select tárolt eljárást. Ha nem látja ezt a tárolt eljárást, kattintson a jobb gombbal a Tárolt eljárások mappára, és válassza a Frissítés lehetőséget. Frissítse a tárolt eljárást úgy, hogy LEFT JOIN segítségével adja vissza a vezető kereszt- és vezetéknevét.

SELECT Employees.EmployeeID, Employees.LastName, 
       Employees.FirstName, Employees.Title, 
       Employees.HireDate, Employees.ReportsTo, 
       Employees.Country,
       Manager.FirstName as ManagerFirstName, 
       Manager.LastName as ManagerLastName
FROM Employees
    LEFT JOIN Employees AS Manager ON
        Employees.ReportsTo = Manager.EmployeeID

Az utasítás frissítése SELECT után mentse a módosításokat a Fájl menüben a Mentés Employees_Selectgombra kattintva. Másik lehetőségként kattintson a Mentés ikonra az eszköztáron, vagy nyomja le a Ctrl+S billentyűkombinációt. A módosítások mentése után kattintson a jobb gombbal a Employees_Select tárolt eljárásra a Kiszolgálókezelőben, és válassza a Végrehajtás parancsot. Ez futtatja a tárolt eljárást, és megjeleníti az eredményeket a Kimeneti ablakban (lásd a 9. ábrát).

A tárolt eljárások eredményei megjelennek a kimeneti ablakban

9. ábra: A tárolt eljárások eredményei megjelennek a kimeneti ablakban (ide kattintva megtekintheti a teljes méretű képet)

3. lépés: A DataTable oszlopainak frissítése

Ekkor a tárolt eljárás visszaadja a Employees_Select, ManagerFirstName és ManagerLastName értékeket, de ezek az oszlopok hiányoznak a EmployeesDataTable-ból. A hiányzó oszlopok kétféleképpen vehetők fel a DataTable-ba:

  • Manuálisan – kattintson a jobb gombbal a DataTable elemre az Adatkészlet-tervezőben, majd a Hozzáadás menüben válassza az Oszlop lehetőséget. Ezután nevezheti el az oszlopot, és ennek megfelelően állíthatja be a tulajdonságait.
  • Automatikusan – a TableAdapter Configuration varázsló frissíti a DataTable oszlopait, hogy azok tükrözzék a SelectCommand tárolt eljárás által visszaadott mezőket. Alkalmi SQL-utasítások használatakor a varázsló eltávolítja a InsertCommand, UpdateCommand, és DeleteCommand tulajdonságokat is, mivel a SelectCommand most már tartalmaz egy JOIN. Tárolt eljárások használatakor azonban ezek a parancstulajdonságok érintetlenek maradnak.

Az előző oktatóanyagokban megismerkedtünk a DataTable oszlopok manuális hozzáadásával, beleértve a Master/Detail Using a Bulleted List of Master Records with a Details DataList és Uploading Files, és a következő oktatóanyagban részletesebben is áttekintjük ezt a folyamatot. Ebben az oktatóanyagban azonban használjuk az automatikus megközelítést a TableAdapter Configuration varázslóval.

Kattintson a jobb gombbal a EmployeesTableAdapter-re, és válassza a Konfigurálás opciót a helyi menüből. Ekkor megjelenik a TableAdapter Configuration varázsló, amely felsorolja a kiválasztáshoz, beszúráshoz, frissítéshez és törléshez használt tárolt eljárásokat, valamint azok visszatérési értékeit és paramétereit (ha vannak ilyenek). A 10. ábrán ez a varázsló látható. Azt láthatjuk, hogy a Employees_Select tárolt eljárás most visszaadja a ManagerFirstName és a ManagerLastName mezőket.

A varázsló a Employees_Select tárolt eljárás frissített oszloplistáját jeleníti meg

10. ábra: A varázsló a tárolt eljárás frissített oszloplistáját jeleníti meg (Employees_Select teljes méretű képet)

A varázsló befejezéséhez kattintson a Befejezés gombra. A DataSet Designerhez való visszatéréskor a EmployeesDataTable következő két oszlopot tartalmazza: ManagerFirstName és ManagerLastName.

Az EmployeesDataTable két új oszlopot tartalmaz

11. ábra: Két EmployeesDataTable új oszlopot tartalmaz (ide kattintva megtekintheti a teljes méretű képet)

Annak szemléltetéséhez, hogy a frissített Employees_Select tárolt eljárás érvényben van, és hogy a TableAdapter beszúrási, frissítési és törlési képességei továbbra is működőképesek, hozzunk létre egy weblapot, amely lehetővé teszi a felhasználók számára az alkalmazottak megtekintését és törlését. Mielőtt azonban létrehoznánk egy ilyen lapot, először létre kell hoznunk egy új osztályt az Üzleti logikai rétegben az NorthwindWithSprocs adathalmazból származó alkalmazottakkal való együttműködéshez. A 4. lépésben létrehozunk egy osztályt EmployeesBLLWithSprocs . Az 5. lépésben ezt az osztályt egy ASP.NET oldalról fogjuk használni.

4. lépés: Az üzleti logikai réteg megvalósítása

Hozzon létre egy új osztályfájlt a ~/App_Code/BLL nevű EmployeesBLLWithSprocs.csmappában. Ez az osztály a meglévő EmployeesBLL osztály szemantikáját utánozza, csak ez az új kevesebb metódust biztosít, és az NorthwindWithSprocs Adathalmazt használja (az Northwind Adathalmaz helyett). Adja hozzá az alábbi kódot a EmployeesBLLWithSprocs osztályhoz.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class EmployeesBLLWithSprocs
{
    private EmployeesTableAdapter _employeesAdapter = null;
    protected EmployeesTableAdapter Adapter
    {
        get
        {
            if (_employeesAdapter == null)
                _employeesAdapter = new EmployeesTableAdapter();
            return _employeesAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.EmployeesDataTable GetEmployees()
    {
        return Adapter.GetEmployees();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Delete, true)]
    public bool DeleteEmployee(int employeeID)
    {
        int rowsAffected = Adapter.Delete(employeeID);
        // Return true if precisely one row was deleted, otherwise false
        return rowsAffected == 1;
    }
}

Az EmployeesBLLWithSprocs osztály s Adapter tulajdonsága az NorthwindWithSprocs Adathalmaz egy EmployeesTableAdapterpéldányát adja vissza. Ezt az s osztály GetEmployees és DeleteEmployee metódusai használják. A GetEmployees metódus meghívja az EmployeesTableAdapter s megfelelő GetEmployees metódust, amely meghívja a Employees_Select tárolt eljárást, és feltölti az eredményeket egy EmployeeDataTable. A DeleteEmployee metódus hasonlóképpen meghívja az EmployeesTableAdapter s Delete metódust, amely meghívja a Employees_Delete tárolt eljárást.

5. lépés: Az adatok használata a bemutató rétegben

EmployeesBLLWithSprocs Az osztály elkészültével készen állunk arra, hogy egy ASP.NET oldalon keresztül dolgozzunk az alkalmazottak adataival. Nyissa meg a JOINs.aspx lapot a AdvancedDAL mappában, és húzza a GridView-t az Eszköztárból a Tervezőbe, majd állítsa be a ID tulajdonságát Employees értékre. Ezután a GridView intelligens címkéje alapján kösse össze a rácsot egy új ObjectDataSource-vezérlővel.EmployeesDataSource

Konfigurálja az ObjectDataSource-t az EmployeesBLLWithSprocs osztály használatára, és a SELECT és a DELETE lapon győződjön meg arról, hogy a legördülő listákban a GetEmployees és DeleteEmployee metódusok vannak kiválasztva. Kattintson a Befejezés gombra az ObjectDataSource konfigurációjának befejezéséhez.

Az ObjectDataSource konfigurálása az EmployeesBLLWithSprocs osztály használatára

12. ábra: Az ObjectDataSource konfigurálása az EmployeesBLLWithSprocs osztály használatára (ide kattintva megtekintheti a teljes méretű képet)

Kérje meg az ObjectDataSource-t, hogy használja a GetEmployees és a DeleteEmployee metódust

13. ábra: Az ObjectDataSource használja a GetEmployees és DeleteEmployee metódusokat (kattintson ide a teljes méretű kép megtekintéséhez)

A Visual Studio minden oszlophoz hozzáad egy BoundFieldet a EmployeesDataTable GridView-hoz. Távolítsa el az összes BoundFields mezőt, kivéve a Title, LastName, FirstName, ManagerFirstName és ManagerLastName mezőket, és nevezze át az utolsó négy BoundFields tulajdonságait a következőkre: vezetéknév, utónév, a kezelő utóneve és a kezelő vezetékneve.

Ahhoz, hogy a felhasználók törölhessenek alkalmazottakat erről a lapról, két dolgot kell tennünk. Először is utasítsa a GridView-t, hogy biztosítson törlési lehetőségeket az intelligens menü Enable Deleting opciójának bejelölésével. Másodszor módosítsa az ObjectDataSource tulajdonságot OldValuesParameterFormatString az ObjectDataSource varázsló (original_{0}) által beállított értékről az alapértelmezett értékre ({0}). A módosítások elvégzése után a GridView és az ObjectDataSource deklaratív korrektúrája a következőhöz hasonlóan fog kinézni:

<asp:GridView ID="Employees" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="EmployeeID" DataSourceID="EmployeesDataSource">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        <asp:BoundField DataField="Title" 
            HeaderText="Title" 
            SortExpression="Title" />
        <asp:BoundField DataField="LastName" 
            HeaderText="Last Name" 
            SortExpression="LastName" />
        <asp:BoundField DataField="FirstName" 
            HeaderText="First Name" 
            SortExpression="FirstName" />
        <asp:BoundField DataField="ManagerFirstName" 
            HeaderText="Manager's First Name" 
            SortExpression="ManagerFirstName" />
        <asp:BoundField DataField="ManagerLastName" 
            HeaderText="Manager's Last Name" 
            SortExpression="ManagerLastName" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="EmployeesDataSource" runat="server" 
    DeleteMethod="DeleteEmployee" OldValuesParameterFormatString="{0}" 
    SelectMethod="GetEmployees" TypeName="EmployeesBLLWithSprocs">
    <DeleteParameters>
        <asp:Parameter Name="employeeID" Type="Int32" />
    </DeleteParameters>
</asp:ObjectDataSource>

Tesztelje ki a lapot egy böngészőben. Ahogy a 14. ábra mutatja, az oldal felsorolja az egyes alkalmazottakat és a felettese nevét (feltéve, hogy van ilyen).

A Employees_Select tárolt eljárás JOIN függvénye a kezelő nevét adja vissza

14. ábra: A JOIN tárolt eljárásban a Employees_Select kezelő nevét adja vissza (kattintson ide a teljes méretű kép megtekintéséhez)

A Törlés gombra kattintva elindítja a törlési munkafolyamatot, amely a tárolt eljárás végrehajtásában Employees_Delete csúcsosul ki. A tárolt eljárásban megkísérelt DELETE utasítás azonban idegenkulcs-korlátozás megsértése miatt meghiúsul (lásd a 15. ábrát). Konkrétan minden alkalmazott egy vagy több rekordot tartalmaz a Orders táblában, ami a törlés meghiúsulását okozza.

A megfelelő megrendelésekkel rendelkező alkalmazott törlése idegenkulcs-korlátozás megsértését eredményezi

15. ábra: A kapcsolódó megrendelésekkel rendelkező alkalmazott törlése idegenkulcs-korlátozás megszegést eredményez (ide kattintva megtekintheti a teljes méretű képet)

Ha engedélyezni szeretné egy alkalmazott törlését, a következőt teheti:

  • Frissítse az idegenkulcs-korlátozást kaszkádolt törlésre,
  • Manuálisan törölje a rekordokat a Orders törölni kívánt alkalmazott(ok) táblájából, vagy
  • Frissítse a Employees_Delete tárolt eljárást, hogy először törölje a kapcsolódó rekordokat a Orders táblából a Employees rekord törlése előtt. Ezt a technikát a Meglévő tárolt eljárások használata a Typed DataSet táblázat adapterekhez című oktatóanyagban tárgyaltuk.

Ezt az olvasóra bízom gyakorlásképpen.

Összefoglalás

A relációs adatbázisok használatakor gyakori, hogy a lekérdezések több kapcsolódó táblából kérik le az adataikat. A korrelált al lekérdezések két JOIN különböző technikát biztosítanak a kapcsolódó táblák adatainak lekérdezésben való eléréséhez. A korábbi oktatóanyagokban leggyakrabban korrelált al lekérdezéseket használtunk, mert a TableAdapter nem tud automatikusan létrehozni INSERT, UPDATEés DELETE utasításokat az s-t érintő JOIN lekérdezésekhez. Bár ezek az értékek manuálisan is megadhatóak, az alkalmi SQL-utasítások használatakor minden testreszabás felülíródik a TableAdapter Konfiguráció varázsló befejezésekor.

Szerencsére a tárolt eljárásokkal létrehozott TableAdapters nem szenved ugyanolyan törékenységben, mint az alkalmi SQL-utasítások használatával létrehozottak. Ezért megvalósítható egy TableAdapter létrehozása, amelynek fő lekérdezése tárolt eljárások használatakor használ JOIN . Ebben az oktatóanyagban láttuk, hogyan hozhat létre ilyen TableAdaptert. Először egy "JOIN nélküli SELECT" lekérdezést használtunk a TableAdapter fő lekérdezéséhez, hogy a megfelelő beszúrási, frissítési és törlési eljárások automatikusan létrejöjjenek. A TableAdapter kezdeti konfigurációjának befejeztével bővítettük a SelectCommand tárolt eljárást, hogy használja a JOIN-et, és újra futtattuk a TableAdapter Configuration varázslót, hogy frissítsük az EmployeesDataTable oszlopait.

A TableAdapter Configuration varázsló ismételt futtatása automatikusan frissítette az oszlopokat, EmployeesDataTable hogy azok tükrözzék a Employees_Select tárolt eljárás által visszaadott adatmezőket. Másik lehetőségként manuálisan is hozzáadhattuk volna ezeket az oszlopokat a DataTable-hoz. A következő oktatóanyagban bemutatjuk, hogy manuálisan kell-e oszlopokat hozzáadni a DataTable-hoz.

Boldog programozást!

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 Teach Yourself 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 vezető véleményezői Hilton Geisenow, David Suru és Teresa Murphy voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.