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


Paraméteres lekérdezések használata az SqlDataSource -nal (C#)

által Scott Mitchell

PDF letöltése

Ebben az oktatóanyagban tovább tekintjük az SqlDataSource vezérlőt, és megtanuljuk, hogyan definiálhat paraméteres lekérdezéseket. A paraméterek deklaratívan és programozottan is megadhatóak, és számos helyről lekérehetők, például a lekérdezéslánc, a munkamenet állapota, más vezérlők stb.

Bevezetés

Az előző oktatóanyagban láttuk, hogyan használhatja az SqlDataSource vezérlőt az adatok közvetlenül az adatbázisból való lekérésére. Az Adatforrás konfigurálása varázslóval kiválaszthatjuk az adatbázist, majd választhatjuk ki a táblából vagy nézetből visszatérni kívánt oszlopokat; adjon meg egy egyéni SQL-utasítást; vagy használjon tárolt eljárást. Függetlenül attól, hogy oszlopokat választ egy táblából vagy nézetből, vagy egyéni SQL-utasítást ad meg, az SqlDataSource vezérlő tulajdonsága SelectCommand hozzárendelve van az eredményül kapott alkalmi SQL SELECT utasításhoz, és ez az SELECT utasítás lesz végrehajtva az SqlDataSource metódus meghívásakor Select() (programozott módon vagy automatikusan egy adat-webvezérlőből).

Az előző oktatóanyag bemutatóiban használt SQL-utasítások SELECT nem tartalmaztak WHERE záradékokat. SELECT Egy utasításban a WHERE záradék használható a visszaadott eredmények korlátozására. Például az 50,00 usd-nél nagyobb költségű termékek nevének megjelenítéséhez használhatjuk a következő lekérdezést:

SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00

A záradékban WHERE használt értékeket általában valamilyen külső forrás határozza meg, például lekérdezési érték, munkamenet-változó vagy felhasználói bemenet a lap webes vezérlőiből. Ideális esetben az ilyen bemenetek paraméterek használatával vannak megadva. A Microsoft SQL Serverrel a paraméterek a következő módon vannak jelölve @parameterName:

SELECT ProductName
FROM Products
WHERE UnitPrice > @Price

Az SqlDataSource támogatja a paraméterezett lekérdezéseket mind a SELECT utasítások, mind a INSERT, UPDATE és DELETE utasítások esetében. Ezenkívül a paraméterértékek automatikusan lekérhetők számos különböző forrásból: a lekérdezési karakterláncból, a munkamenet-állapotból, az oldal vezérlőiből, és így tovább, vagy programozott módon rendelhetők hozzá. Ebben az oktatóanyagban a paraméteres lekérdezések definiálását, valamint a paraméterértékek deklaratív és programozott megadását tekintjük át.

Megjegyzés:

Az előző oktatóanyagban összehasonlítottuk az ObjectDataSource-t, amely az első 46 oktatóanyagban az SqlDataSource-hoz képest választott eszközünk volt, és a fogalmi hasonlóságukat is feltüntettük. Ezek a hasonlóságok a paraméterekre is kiterjednek. Az ObjectDataSource paraméterei az üzleti logikai réteg metódusainak bemeneti paramétereihez rendelve. Az SqlDataSource-nal a paraméterek közvetlenül az SQL-lekérdezésen belül vannak definiálva. Mindkét vezérlő rendelkezik paramétergyűjteményekkel Select(), Insert(), Update() és Delete() metódusokhoz, és mindkettő rendelkezhet előre definiált forrásokból (lekérdezési értékek, munkamenet-változók stb.) vagy programozott módon beállított paraméterértékekkel.

Paraméteres lekérdezés létrehozása

Az SqlDataSource vezérlő Adatforrás konfigurálása varázsló három lehetőséget kínál az adatbázisrekordok lekéréséhez végrehajtandó parancs meghatározásához:

  • Ha egy meglévő táblából vagy nézetből választja ki az oszlopokat,
  • Egyéni SQL-utasítás beírásával vagy
  • A tárolt eljárás kiválasztásával

Ha meglévő táblából vagy nézetből választ oszlopokat, a WHERE záradék paramétereit a Záradék hozzáadása WHERE párbeszédpanelen kell megadni. Egyéni SQL-utasítás létrehozásakor azonban közvetlenül a záradékba is beírhatja a WHERE paramétereket ( @parameterName az egyes paraméterek jelölésével). A tárolt eljárás egy vagy több SQL-utasításból áll, és ezek az utasítások paraméterezhetők. Az SQL-utasításokban használt paramétereket azonban bemeneti paraméterként kell átadni a tárolt eljárásnak.

Mivel a paraméteres lekérdezések létrehozása az SqlDataSource-ok SelectCommand megadásától függ, vessünk egy pillantást mindhárom módszerre. Első lépésként nyissa meg a ParameterizedQueries.aspx lapot a SqlDataSource mappában, húzzon egy SqlDataSource-vezérlőt az Eszközkészletből a Tervezőbe, és állítsa be a ID kívánt értéket Products25BucksAndUnderDataSource. Ezután kattintson az Adatforrás konfigurálása hivatkozásra a vezérlő intelligens címkéje alapján. Jelölje ki a használni kívánt adatbázist (NORTHWINDConnectionString), majd kattintson a Tovább gombra.

1. lépés: WHERE záradék hozzáadása tábla vagy nézet oszlopainak kiválasztásakor

Amikor kiválasztja az adatbázisból az SqlDataSource vezérlővel visszatérni kívánt adatokat, az Adatforrás konfigurálása varázslóval egyszerűen kiválaszthatjuk a meglévő táblából vagy nézetből való visszatéréshez szükséges oszlopokat (lásd az 1. ábrát). Ezzel automatikusan létrehoz egy SQL-utasítást SELECT , amelyet a rendszer az SqlDataSource metódus meghívásakor Select() küld az adatbázisnak. Ahogy az előző oktatóanyagban tettük, válassza ki a Termékek táblát a legördülő listából, és jelölje be az ProductID, ProductName, és UnitPrice oszlopokat.

Válassza ki a táblából vagy nézetből visszatérni kívánt oszlopokat

1. ábra: Válassza ki a táblázatból vagy nézetből visszatérni kívánt oszlopokat (kattintson ide a teljes méretű kép megtekintéséhez)

Ha egy záradékot WHERE szeretne belefoglalni az SELECT utasításba, kattintson a WHERE gombra, amely megjeleníti a Záradék hozzáadása WHERE párbeszédpanelt (lásd a 2. ábrát). Ha paramétert szeretne hozzáadni a lekérdezés által SELECT visszaadott eredmények korlátozásához, először válassza ki az oszlopot az adatok szűréséhez. Ezután válassza ki a szűréshez használni kívánt operátort (=, <, <=, >stb.). Végül válassza ki a paraméter s értékének forrását, például a lekérdezési vagy munkamenet-állapotból. Miután konfigurálta a paramétert, kattintson a Hozzáadás gombra, hogy belefoglalja a SELECT lekérdezésbe.

Ebben a példában csak azokat az UnitPrice eredményeket adja vissza, amelyek értéke kisebb vagy egyenlő 25,00 USD-nél. Ezért válassza ki a UnitPrice az Oszlop legördülő listából és < értékét az Operátor legördülő listából. Ha rögzített paraméterértéket használ (például 25,00 USD), vagy ha a paraméter értékét programozott módon szeretné megadni, válassza a Nincs lehetőséget a Forrás legördülő listából. Ezután írja be a 25.00-s Érték szövegmezőbe a rögzített paraméter értékét, és a Hozzáadás gombra kattintva fejezze be a folyamatot.

A WHERE záradék hozzáadása párbeszédpanelről visszaadott eredmények korlátozása

2. ábra: A Hozzáadás záradék WHERE párbeszédpanelről megjelenített eredmények korlátozása (a teljes méretű kép megtekintéséhez kattintson ide)

A paraméter hozzáadása után kattintson az OK gombra az Adatforrás konfigurálása varázslóhoz való visszatéréshez. A SELECT varázsló alján található utasításnak tartalmaznia kell egy WHERE záradékot a következő nevű paraméterrel @UnitPrice:

SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)

Megjegyzés:

Ha a záradékban több feltételt is megad a WHERE Záradék hozzáadása WHERE párbeszédpanelen, a varázsló összekapcsolja őket az AND operátorral. Ha a OR elemet be kell foglalnia a WHERE záradékba (például WHERE UnitPrice <= @UnitPrice OR Discontinued = 1), akkor az utasítást az SELECT egyéni SQL-utasítás képernyőjén kell felépítenie.

Fejezze be az SqlDataSource konfigurálását (kattintson a Tovább, majd a Befejezés gombra), majd vizsgálja meg az SqlDataSource deklaratív korrektúrát. A markup mostantól tartalmaz egy <SelectParameters> gyűjteményt, amely felsorolja a SelectCommand paramétereinek forrásait.

<asp:SqlDataSource ID="Products25BucksAndUnderDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand=
        "SELECT [ProductID], [ProductName], [UnitPrice]
        FROM [Products] WHERE ([UnitPrice] <= @UnitPrice)">
    <SelectParameters>
        <asp:Parameter DefaultValue="25.00" Name="UnitPrice" Type="Decimal" />
    </SelectParameters>
</asp:SqlDataSource>

Az SqlDataSource Select() metódus meghívásakor a rendszer a UnitPrice paraméter értékét (25.00) alkalmazza a @UnitPrice paraméterre az SelectCommand adatbázisba való küldés előtt. A nettó eredmény az, hogy csak a 25,00 USD-nél kisebb vagy azzal egyenlő termékek lesznek visszaadva a Products táblából. Ennek megerősítéséhez adjon hozzá egy GridView-t a laphoz, kösse hozzá az adatforráshoz, majd tekintse meg a lapot egy böngészőben. Csak azokat a termékeket kell látnia, amelyek 25,00 usd-nél kisebbek vagy egyenlők, ahogy a 3. ábra is megerősíti.

Csak azok a termékek jelennek meg, amelyek 25,00 usd-nél kisebbek vagy egyenlők

3. ábra: Csak a 25,00 USD-nél kisebb vagy egyenlő termékek jelennek meg (kattintson ide a teljes méretű kép megtekintéséhez)

2. lépés: Paraméterek hozzáadása egyéni SQL-utasításhoz

Egyéni SQL-utasítás hozzáadásakor explicit módon beírhatja a WHERE záradékot, vagy megadhat egy értéket a Lekérdezésszerkesztő Szűrőcellájában. Ennek szemléltetéséhez csak azokat a termékeket jelenítsük meg a GridView-ban, amelyek árai kisebbek egy bizonyos küszöbértéknél. Először adjon hozzá egy Szövegdobozt a laphoz, ParameterizedQueries.aspx hogy összegyűjtse ezt a küszöbértéket a felhasználótól. A TextBox tulajdonság ID beállítása a következőre MaxPrice: . Adjon hozzá egy gomb webvezérlőt, és állítsa be a tulajdonságát Text az egyező termékek megjelenítésére.

Ezután húzzon egy GridView-t a lapra, és az intelligens címkéjéből válassza ki, hogy hozzon létre egy új SqlDataSource-t, amelynek neve ProductsFilteredByPriceDataSource. Az Adatforrás konfigurálása varázslóban lépjen az Egyéni SQL-utasítás vagy tárolt eljárás megadása képernyőre (lásd a 4. ábrát), és írja be a következő lekérdezést:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice

Miután beírta a lekérdezést (manuálisan vagy a Lekérdezésszerkesztőn keresztül), kattintson a Tovább gombra.

Csak azokat a termékeket adja vissza, amelyek kisebbek vagy egyenlők egy paraméterértékkel

4. ábra: Csak azokat a termékeket adja vissza, amelyek kisebbek vagy egyenlők egy paraméterértékkel (kattintson ide a teljes méretű kép megtekintéséhez)

Mivel a lekérdezés paramétereket tartalmaz, a varázsló következő képernyője kéri a paraméterértékek forrását. Válassza a "Vezérlő" opciót a Paraméter forrás legördülő listájából, és MaxPrice (a Szövegdoboz vezérlő ID értéke) a VezérlőAzonosító legördülő listából. Megadhat egy opcionális alapértelmezett értéket is, amelyet akkor is használhat, ha a felhasználó nem írt be szöveget a MaxPrice Szövegdobozba. Egyelőre ne adjon meg alapértelmezett értéket.

A MaxPrice TextBox szövegtulajdonság paraméterforrásként van használva

5. ábra: A MaxPrice TextBox tulajdonság Text paraméterforrásként van használva (kattintson ide a teljes méretű kép megtekintéséhez)

Hajtsa végre az Adatforrás konfigurálása varázslót a Tovább, majd a Befejezés gombra kattintva. A GridView, TextBox, Button és SqlDataSource deklaratív jelölései a következők:

Maximum price:
$<asp:TextBox ID="MaxPrice" runat="server" Columns="5" />
 
<asp:Button ID="DisplayProductsLessThanButton" runat="server"
    Text="Display Matching Products" />
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
    DataSourceID="ProductsFilteredByPriceDataSource" EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            HtmlEncode="False" DataFormatString="{0:c}"
            SortExpression="UnitPrice" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsFilteredByPriceDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand=
        "SELECT ProductName, UnitPrice 
        FROM Products WHERE UnitPrice <= @MaximumPrice">
    <SelectParameters>
        <asp:ControlParameter ControlID="MaxPrice" Name="MaximumPrice"
            PropertyName="Text" />
    </SelectParameters>
</asp:SqlDataSource>

Vegye figyelembe, hogy az SqlDataSource szakaszában <SelectParameters> található paraméter egy ControlParameter, amely további tulajdonságokat is tartalmaz, például ControlID és PropertyName. Amikor meghívják az SqlDataSource Select() metódust, a ControlParameter lekéri az értéket a megadott webvezérlő tulajdonságból, és hozzárendeli a megfelelő paraméterhez a SelectCommand. Ebben a példában a rendszer az MaxPrice s Text tulajdonságot használja paraméterértékként @MaxPrice .

Szánjon egy percet a lap böngészőben való megtekintésére. Amikor először látogatja meg a lapot, vagy amikor a MaxPrice Szövegdoboz nem tartalmaz értéket, a GridView-ban nem jelennek meg rekordok.

Nem jelennek meg rekordok, ha a MaxPrice szövegmező üres

6. ábra: A szövegdoboz üres állapotában MaxPrice nem jelennek meg rekordok (ide kattintva megtekintheti a teljes méretű képet)

A termékek nem jelennek meg, mert alapértelmezés szerint egy paraméterérték üres sztringje adatbázis-értékké NULL lesz konvertálva. Mivel az összehasonlítás [UnitPrice] <= NULL mindig hamis, a rendszer nem ad vissza eredményt.

Adjon meg egy értéket a szövegmezőbe(például 5.00), és kattintson a Megfelelő termékek megjelenítése gombra. Visszacsatoláskor az SqlDataSource tájékoztatja a GridView-t, hogy az egyik paraméterforrása megváltozott. Ennek következtében a GridView újraköti az SqlDataSource-t, és az 5,00 usd-nél kisebb vagy egyenlő termékeket jeleníti meg.

Az 5,00 usd-nél kisebb vagy egyenlő termékek jelennek meg

7. ábra: Az 5,00 usd-nél kisebb vagy egyenlő termékek jelennek meg (ide kattintva megtekintheti a teljes méretű képet)

Az összes termék kezdeti megjelenítése

Ahelyett, hogy egyetlen terméket sem jelenítenénk meg az oldal első betöltésekor, érdemes lehet az összes terméket megjeleníteni. Az összes termék listázásának egyik módja, ha a MaxPrice TextBox üres, akkor a paraméter alapértelmezett értékét egy őrülten magas értékre, például 1000000 értékre kell állítani, mivel nem valószínű, hogy a Northwind Traders valaha is rendelkezik olyan készlettel, amelynek egységára meghaladja az 1 000 000 usd-t. Ez a megközelítés azonban rövidlátó, és előfordulhat, hogy más helyzetekben nem működik.

A korábbi oktatóanyagokban – Deklaratív paraméterek és fő/részletszűrés legördülő listával hasonló problémával szembesültünk. A megoldás az volt, hogy ezt a logikát az üzleti logikai rétegbe helyeztük. Pontosabban a BLL megvizsgálta a bejövő értéket, és ha foglalt érték volt NULL , a hívás az összes rekordot visszaadó DAL metódushoz lett irányítva. Ha a bejövő érték normál szűrési érték volt, hívást kezdeményeztek a DAL metódushoz, amely egy SQL-utasítást hajtott végre, amely egy paraméteres WHERE záradékot használt a megadott értékkel.

Az SqlDataSource használatakor sajnos megkerüljük az architektúrát. Ehelyett testre kell szabnunk az SQL-utasítást, hogy intelligensen megragadjuk az összes rekordot, ha a @MaximumPrice paraméter NULL vagy valamilyen fenntartott érték. Ebben a gyakorlatban tegyük meg, hogy ha a @MaximumPrice paraméter egyenlő -1.0, akkor az összes rekordot vissza kell adni (-1.0 fenntartott értékként működik, mivel egyetlen termék sem rendelkezhet negatív UnitPrice értékkel). Ehhez a következő SQL-utasítást használhatjuk:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0

Ez a WHERE záradék az összes rekordot visszaadja, ha a @MaximumPrice paraméter egyenlő -1.0. Ha a paraméter értéke nem -1.0, csak azokat a termékeket adja vissza, amelyek UnitPrice kisebbek vagy egyenlők a @MaximumPrice paraméterértékkel. Az első oldal betöltésekor (vagy amikor a @MaximumPrice TextBox üres) a -1.0 paraméter alapértelmezett értékét MaxPrice-re állítva, a @MaximumPrice értéke -1.0 lesz, és az összes termék megjelenik.

Most minden termék megjelenik, ha a MaxPrice szövegmező üres

8. ábra: Most minden termék megjelenik, ha a MaxPrice szövegdoboz üres (kattintson ide a teljes méretű kép megtekintéséhez)

Ezzel a megközelítéssel kapcsolatban néhány figyelmeztetést is fel kell jegyezni. Először is tisztában kell azzal, hogy a paraméter adattípusa az SQL-lekérdezésben való használatból következik. Ha a záradékot WHERE-ről @MaximumPrice = -1.0-re módosítja, a futtatókörnyezet egész számként kezeli a paramétert. Ha ezután egy decimális értékhez (például 5.00- hoz) próbálja hozzárendelni a MaxPrice Szövegdobozt, hiba történik, mert az 5,00 nem konvertálható egész számmá. Ennek orvoslásához győződjön meg arról, hogy a @MaximumPrice = -1.0 záradékban használja a WHERE, vagy még jobb, ha az ControlParameter objektum Type tulajdonságát Decimális értékre állítja.

Másodszor, azáltal, hogy hozzáadja a OR @MaximumPrice = -1.0 a WHERE záradékhoz, a lekérdezési motor nem tud használni indexet UnitPrice (feltételezve, hogy létezik ilyen), ez táblaszkenneléshez vezet. Ez hatással lehet a teljesítményre, ha elegendő számú rekord található a Products táblában. Jobb megoldás lenne, ha ezt a logikát egy olyan tárolt eljárásra helyeznénk át, ahol egy IF utasítás végrehajt egy SELECT lekérdezést a Products táblából WHERE záradék nélkül, amikor minden rekordot vissza kell adni, vagy egy olyat, amelynek WHERE záradéka csak a UnitPrice feltételeket tartalmazza, így lehetőség van egy index használatára.

3. lépés: Paraméteres tárolt eljárások létrehozása és használata

A tárolt eljárások tartalmazhatnak olyan bemeneti paramétereket, amelyek ezután használhatók a tárolt eljárásban definiált SQL-utasítás(ok)ban. Ha az SqlDataSource-t olyan tárolt eljárás használatára konfigurálja, amely fogadja a bemeneti paramétereket, ezek a paraméterértékek ugyanazokzal a technikákkal adhatók meg, mint az alkalmi SQL-utasítások esetén.

Az SqlDataSource tárolt eljárásainak szemléltetéséhez hozzunk létre egy új tárolt eljárást a Northwind-adatbázisban GetProductsByCategory, amely egy elnevezett @CategoryID paramétert fogad el, és visszaadja a termékek összes oszlopát, amelyeknek CategoryID az oszlopa megegyezik @CategoryID. Tárolt eljárás létrehozásához lépjen a Szerverkezelőbe, és bontsa ki a NORTHWND.MDF adatbázist. (Ha nem látja a Kiszolgálókezelőt, lépjen a Nézet menüre, és válassza a Kiszolgálókezelő lehetőséget.)

NORTHWND.MDF Az adatbázisból kattintson a jobb gombbal a Tárolt eljárások mappára, válassza az Új tárolt eljárás hozzáadása lehetőséget, és írja be a következő szintaxist:

CREATE PROCEDURE dbo.GetProductsByCategory
(
      @CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID

A tárolt eljárás mentéséhez kattintson a Mentés ikonra (vagy a Ctrl+S billentyűkombinációra). A tárolt eljárás teszteléséhez kattintson rá a jobb gombbal a Tárolt eljárások mappából, és válassza az Execute (Végrehajtás) lehetőséget. Ez kérni fogja a tárolt eljárás paramétereit (@CategoryIDebben a példában), amely után az eredmények megjelennek a Kimeneti ablakban.

A GetProductsByCategory tárolt eljárás <span class= @CategoryID of 1" />

9. ábra: A GetProductsByCategory tárolt eljárás 1-es művelettel @CategoryID történő végrehajtásakor (kattintson ide a teljes méretű kép megtekintéséhez)

Ezt a tárolt eljárást használva jelenítsük meg az összes terméket az Italok kategóriában egy GridView-ban. Adjon hozzá egy új GridView-t a laphoz, és kösse hozzá egy új SqlDataSource-hoz.BeverageProductsDataSource Folytassa az Egyéni SQL-utasítás vagy tárolt eljárás megadása képernyővel, válassza a Tárolt eljárás választógombot, és válassza ki a GetProductsByCategory tárolt eljárást a legördülő listából.

Válassza ki a GetProductsByCategory tárolt eljárást a Drop-Down listából

10. ábra: Válassza ki a GetProductsByCategory tárolt eljárást a Drop-Down listából (kattintson ide a teljes méretű kép megtekintéséhez)

Mivel a tárolt eljárás elfogad egy bemeneti paramétert (@CategoryID), a Tovább gombra kattintva meg kell adnia a paraméter értékének forrását. Az Italok CategoryID értéke 1, ezért hagyja meg a Paraméter forrás legördülő listáját a Nincs helyen, és írja be az 1 értéket az AlapértelmezettÉrték szövegmezőbe.

Hard-Coded 1 érték használatával adja vissza a termékeket az Italok kategóriában

11. ábra: 1-es Hard-Coded értékkel adja vissza a termékeket az Italok kategóriában (kattintson ide a teljes méretű kép megtekintéséhez)

Ahogy az alábbi deklaratív jelölés is mutatja, a tárolt eljárás használatakor az SqlDataSource SelectCommand tulajdonsága a tárolt eljárás nevére van állítva, ami azt jelzi, hogy SelectCommandType egy tárolt eljárás neve, nem egy alkalmi SQL-utasítás.

<asp:SqlDataSource ID="BeverageProductsDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter DefaultValue="1" Name="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

Tesztelje az oldalt egy böngészőben. Csak az Italok kategóriához tartozó termékek jelennek meg, bár az összes termékmező megjelenik, mivel a GetProductsByCategory tárolt eljárás a tábla összes oszlopát Products visszaadja. A GridView oszlopainak szerkesztése párbeszédpanelen természetesen korlátozhatjuk vagy testre szabhatjuk a GridView-ban megjelenő mezőket.

Az összes ital megjelenik

12. ábra: Az összes ital megjelenik (kattintson ide a teljes méretű kép megtekintéséhez)

4. lépés: SqlDataSource Select() utasításának programozott invokálása

Az előző oktatóanyagban és az oktatóanyagban eddig látott példák közvetlenül a GridView-hoz kötötték az SqlDataSource-vezérlőket. Az SqlDataSource vezérlő adatai azonban programozott módon érhetők el és kódban számba vehetők. Ez különösen akkor lehet hasznos, ha adatokat kell lekérdeznie az ellenőrzéshez, de nem kell megjelenítenie. Ahelyett, hogy meg kellene írnia az összes sablont ADO.NET kódot az adatbázishoz való csatlakozáshoz, meg kell adnia a parancsot, és lekérnie az eredményeket, engedélyezheti, hogy az SqlDataSource kezelje ezt a monoton kódot.

Az SqlDataSource-adatok programozott használatának szemléltetéséhez képzelje el, hogy a főnöke egy olyan weblap létrehozására irányuló kéréssel kereste meg Önt, amely megjeleníti egy véletlenszerűen kiválasztott kategória és a hozzájuk tartozó termékek nevét. Vagyis amikor egy felhasználó meglátogatja ezt a lapot, véletlenszerűen ki szeretnénk választani egy kategóriát a Categories táblázatból, megjelenítjük a kategória nevét, majd listázzuk az adott kategóriához tartozó termékeket.

Ehhez két SqlDataSource-vezérlőre van szükség, amelyek közül az egyik véletlenszerű kategóriát fog a Categories táblából, a másik pedig a kategória termékeit. Létrehozzuk az SqlDataSource-t, amely egy véletlenszerű kategóriarekordot kér le ebben a lépésben; Az 5. lépés a kategória termékeit lekérő SqlDataSource-t vizsgálja.

Először adjon hozzá egy SqlDataSource-t ParameterizedQueries.aspx, és állítsa be a ID értékét RandomCategoryDataSource-re. Konfigurálja úgy, hogy a következő SQL-lekérdezést használja:

SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()

ORDER BY NEWID() véletlenszerű sorrendben rendezve adja vissza a rekordokat (lásd a Rekordok véletlenszerű rendezése című NEWID() témakört). SELECT TOP 1 az eredményhalmaz első rekordját adja vissza. Összevonva, ez a lekérdezés egy véletlenszerűen kiválasztott kategóriából visszaadja a CategoryID és CategoryName oszlopok értékeit.

A kategória CategoryName értékének megjelenítéséhez vegyen fel egy Címke web vezérlőt a lapra, állítsa a ID tulajdonságot CategoryNameLabel értékre, és törölje a Text tulajdonságot. Ahhoz, hogy programozott módon lekérjük az adatokat egy SqlDataSource-vezérlőből, meg kell hívnunk annak metódusát Select() . A Select() metódus egyetlen típusú bemeneti paramétert DataSourceSelectArgumentsvár, amely meghatározza, hogyan kell elküldeni az adatokat a visszaadás előtt. Ez magában foglalhatja az adatok rendezésére és szűrésére vonatkozó utasításokat, és az adat webes vezérlői használják az sqldatasource-vezérlők adatainak rendezésekor vagy lapozásakor. Példánkban azonban nincs szükség az adatok módosítására a visszaadás előtt, ezért az DataSourceSelectArguments.Empty objektumba kerül.

A Select() metódus olyan objektumot ad vissza, amely megvalósítja a IEnumerable-t. A visszaadott pontos típus az SqlDataSource vezérlő DataSourceMode tulajdonságának értékétől függ. Az előző oktatóanyagban leírtaknak megfelelően ez a tulajdonság vagy az DataSet vagy az DataReader értékre állítható. Ha be van DataSetállítva, a Select() metódus egy DataView-objektumot ad vissza, ha az értékre DataReadervan állítva, egy implementálandó IDataReaderobjektumot ad vissza. Mivel az RandomCategoryDataSource SqlDataSource tulajdonsága DataSourceMode (alapértelmezett) értékre DataSet van állítva, egy DataView-objektummal fogunk dolgozni.

Az alábbi kód bemutatja, hogyan kérhetők le a rekordok az RandomCategoryDataSource SqlDataSource-ból DataView-ként, valamint hogyan olvasható be az CategoryName oszlop értéke az első DataView sorból:

protected void Page_Load(object sender, EventArgs e)
{
    // Get the data from the SqlDataSource as a DataView
    DataView randomCategoryView =
        (DataView)RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty);
    if (randomCategoryView.Count > 0)
    {
        // Assign the CategoryName value to the Label
        CategoryNameLabel.Text =
            string.Format("Here are Products in the {0} Category...",
                randomCategoryView[0]["CategoryName"].ToString());
    }
}

randomCategoryView[0] A DataView-ban az elsőt DataRowView adja vissza. randomCategoryView[0]["CategoryName"] Az első sor oszlopának CategoryName értékét adja vissza. Vegye figyelembe, hogy a DataView lazán típusos. Egy adott oszlopértékre való hivatkozáshoz sztringként kell megadni az oszlop nevét ( CategoryName, ebben az esetben). A 13. ábrán a lap megtekintésekor megjelenő üzenet látható CategoryNameLabel . Természetesen a megjelenített tényleges kategórianevet az RandomCategoryDataSource SqlDataSource véletlenszerűen választja ki az oldal minden egyes látogatásakor (beleértve a postbackeket is).

Megjelenik a véletlenszerűen kiválasztott kategória neve

13. ábra: Megjelenik a véletlenszerűen kiválasztott kategória neve (ide kattintva megtekintheti a teljes méretű képet)

Megjegyzés:

Ha az SqlDataSource vezérlő egy DataSourceMode tulajdonságot kap, amely DataReader-ként lett beállítva, akkor a Select() metódus visszatérési értékét át kellett volna alakítani IDataReader-ra. Az első sor oszlopértékének CategoryName beolvasásához a következő kódot használjuk:

if (randomCategoryReader.Read())
{
   string categoryName = randomCategoryReader["CategoryName"].ToString();
   ...
}

Ha az SqlDataSource véletlenszerűen kiválaszt egy kategóriát, készen állunk a kategória termékeit listázó GridView hozzáadására.

Megjegyzés:

Egy címke webvezérlő használata helyett, amely a kategória nevét jeleníti meg, hozzáadhattunk volna egy FormView-t vagy DetailsView-t az oldalhoz, amelyet az SqlDataSource-hoz kötünk. A címke használatával azonban megvizsgálhattuk, hogyan hívhatjuk meg programozott módon az SqlDataSource utasítását Select() , és hogyan dolgozhatunk az eredményül kapott adatokkal kódban.

5. lépés: Paraméterértékek programozott hozzárendelése

Az oktatóanyagban eddig látott összes példa vagy egy rögzített paraméterértéket használt, vagy az egyik előre definiált paraméterforrásból vett értéket (lekérdezési értéket, egy webes vezérlőt a lapon stb.). Az SqlDataSource vezérlő paraméterei azonban programozott módon is beállíthatók. Az aktuális példa elvégzéséhez olyan SqlDataSource-ra van szükségünk, amely egy adott kategóriához tartozó összes terméket visszaadja. Ennek az SqlDataSource-nak egy CategoryID paramétere lesz, amelynek értékét az CategoryID SqlDataSource által az RandomCategoryDataSource eseménykezelőben Page_Load visszaadott oszlopérték alapján kell beállítani.

Először adjon hozzá egy GridView-t a laphoz, és kösse hozzá egy új SqlDataSource-hoz.ProductsByCategoryDataSource A 3. lépéshez hasonlóan konfigurálja az SqlDataSource-t úgy, hogy meghívja a GetProductsByCategory tárolt eljárást. Hagyja a Paraméter forrás legördülő listában a Nincs értéket, de ne adjon meg alapértelmezett értéket, mivel programozott módon állítjuk be ezt az alapértelmezett értéket.

Képernyőkép az Adatforrás konfigurálása ablakról, amelynek paraméterforrása Nincs értékre van állítva.

14. ábra: Ne adjon meg paraméterforrást vagy alapértelmezett értéket (kattintson ide a teljes méretű kép megtekintéséhez)

Az SqlDataSource varázsló befejezése után az eredményként kapott deklaratív korrektúra a következőhöz hasonlóan néz ki:

<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter Name="CategoryID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

A DefaultValue paramétert programozottan hozzárendelhetjük CategoryID az Page_Load eseménykezelőben.

// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
    randomCategoryView[0]["CategoryID"].ToString();

Ezzel a kiegészítéssel az oldal tartalmaz egy GridView-t, amely megjeleníti a véletlenszerűen kiválasztott kategóriához társított termékeket.

Képernyőkép a Véletlenszerűen kijelölt kategória lapról.

15. ábra: Ne adjon meg paraméterforrást vagy alapértelmezett értéket (kattintson ide a teljes méretű kép megtekintéséhez)

Összefoglalás

Az SqlDataSource lehetővé teszi a lapfejlesztők számára, hogy olyan paraméteres lekérdezéseket definiáljanak, amelyek paraméterértékei kódoltak, előre definiált paraméterforrásokból lekértek vagy programozott módon vannak hozzárendelve. Ebben az oktatóanyagban azt láttuk, hogyan hozhat létre paraméteres lekérdezést az Adatforrás konfigurálása varázslóból alkalmi SQL-lekérdezésekhez és tárolt eljárásokhoz. Azt is megvizsgáltuk, hogyan használhatja a szigorúan kódolt paraméterforrásokat, egy webvezérlőt paraméterforrásként, és programozott módon meghatároztuk a paraméter értékét.

Az ObjectDataSource-hoz hasonlóan az SqlDataSource is képes a mögöttes adatok módosítására. A következő oktatóanyagban azt vizsgáljuk meg, hogyan definiálhatunk INSERT, UPDATE és DELETE utasításokat az SqlDataSource-szal. Miután hozzáadtuk ezeket az utasításokat, használhatjuk a GridView, a DetailsView és a FormView vezérlők beépített beszúrási, szerkesztési és törlési funkcióit.

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 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 Scott Clyde, Randell Schmidt és Ken Pespisa voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.