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
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
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.
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.
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.
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.
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.
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.
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.
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).
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
SelectCommandtárolt eljárás által visszaadott mezőket. Alkalmi SQL-utasítások használatakor a varázsló eltávolítja aInsertCommand,UpdateCommand, ésDeleteCommandtulajdonságokat is, mivel aSelectCommandmost már tartalmaz egyJOIN. 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.
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.
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.
12. ábra: Az ObjectDataSource konfigurálása az EmployeesBLLWithSprocs osztály használatára (ide kattintva megtekintheti a teljes méretű képet)
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).
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.
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
Orderstörölni kívánt alkalmazott(ok) táblájából, vagy - Frissítse a
Employees_Deletetárolt eljárást, hogy először törölje a kapcsolódó rekordokat aOrderstáblából aEmployeesrekord 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.