Použití parametrizovaných dotazů s ovládacím prvkem SqlDataSource (C#)

Scott Mitchell

Stáhnout PDF

V tomto kurzu budeme pokračovat v pohledu na ovládací prvek SqlDataSource a naučíme se definovat parametrizované dotazy. Parametry je možné zadat deklarativně i programově a lze je načíst z řady umístění, jako je řetězec dotazu, stav relace, další ovládací prvky a další.

Úvod

V předchozím kurzu jsme viděli, jak pomocí ovládacího prvku SqlDataSource načíst data přímo z databáze. Pomocí průvodce Konfigurovat zdroj dat jsme mohli zvolit databázi a pak vybrat sloupce, které se mají vrátit z tabulky nebo zobrazení; Zadejte vlastní příkaz SQL. nebo použít uloženou proceduru. Ať už vybíráte sloupce z tabulky nebo zobrazení nebo zadáváte vlastní příkaz SQL, vlastnost s ovládacího prvku SelectCommand SqlDataSource se přiřadí k výslednému ad hoc příkazu SQL SELECT a tento SELECT příkaz se spustí při vyvolání metody SqlDataSource Select() (buď programově, nebo automaticky z datového webového ovládacího prvku).

Příkazy SQL SELECT použité v ukázkách předchozího kurzu postrádaly WHERE klauzule. V příkazu SELECT lze klauzuli WHERE použít k omezení vrácených výsledků. Například k zobrazení názvů produktů s cenou vyšší než 50,00 USD bychom mohli použít následující dotaz:

SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00

Hodnoty použité v WHERE klauzuli jsou obvykle určovaly externím zdrojem, například hodnotou řetězce dotazu, proměnnou relace nebo uživatelským vstupem z webového ovládacího prvku na stránce. V ideálním případě se tyto vstupy zadává pomocí parametrů. U Microsoft SQL Server jsou parametry označeny pomocí @parameterName, jako v:

SELECT ProductName
FROM Products
WHERE UnitPrice > @Price

SqlDataSource podporuje parametrizované dotazy, a INSERTto jak pro příkazy, tak pro SELECT příkazy , UPDATEa DELETE . Kromě toho je možné hodnoty parametrů automaticky načíst z různých zdrojů: řetězec dotazu, stav relace, ovládací prvky na stránce atd. Nebo je možné je přiřadit programově. V tomto kurzu se dozvíte, jak definovat parametrizované dotazy a jak zadat hodnoty parametrů deklarativně i programově.

Poznámka

V předchozím kurzu jsme porovnali ObjectDataSource, který byl naším nástrojem volbou v prvních 46 kurzech s SqlDataSource, a zaznamenali jsme jejich koncepční podobnosti. Tyto podobnosti se vztahují také na parametry. Parametry ObjectDataSource namapované na vstupní parametry pro metody ve vrstvě obchodní logiky. S SqlDataSource jsou parametry definovány přímo v rámci dotazu SQL. Oba ovládací prvky mají kolekce parametrů pro své Select()metody , Insert(), Update()a Delete() a oba můžou mít tyto hodnoty parametrů vyplněné z předdefinovaných zdrojů (hodnoty řetězce dotazu, proměnné relace atd.) nebo přiřazené programově.

Vytvoření parametrického dotazu

Průvodce Konfigurovat zdroj dat ovládacího prvku SqlDataSource nabízí tři cesty pro definování příkazu pro načtení záznamů databáze:

  • Výběrem sloupců z existující tabulky nebo zobrazení
  • Zadáním vlastního příkazu SQL nebo
  • Výběrem uložené procedury

Při výběru sloupců z existující tabulky nebo zobrazení musí být parametry WHERE klauzule zadány prostřednictvím dialogového okna Přidat WHERE klauzuli. Při vytváření vlastního příkazu SQL však můžete zadat parametry přímo do klauzule (pomocí @parameterName příkazu k označení každého parametruWHERE). Uložená procedura se skládá z jednoho nebo více příkazů SQL a tyto příkazy lze parametrizovat. Parametry použité v příkazech SQL se však musí předat jako vstupní parametry uložené proceduře.

Vzhledem k tomu, že vytvoření parametrizovaného dotazu závisí na tom, jak je zadána hodnota SqlDataSource SelectCommand , pojďme se podívat na všechny tři přístupy. Začněte tak, že ParameterizedQueries.aspx otevřete stránku ve SqlDataSource složce, přetáhnete ovládací prvek SqlDataSource z panelu nástrojů do Designer a nastavíte jeho ID hodnotu na Products25BucksAndUnderDataSource. Potom klikněte na odkaz Konfigurovat zdroj dat z inteligentní značky ovládacího prvku. Vyberte databázi, která se má použít (NORTHWINDConnectionString) a klikněte na Další.

Krok 1: Přidání klauzule WHERE při výběru sloupců z tabulky nebo zobrazení

Při výběru dat, která se mají vrátit z databáze pomocí ovládacího prvku SqlDataSource, nám průvodce Konfigurovat zdroj dat umožňuje jednoduše vybrat sloupce, které se mají vrátit z existující tabulky nebo zobrazení (viz Obrázek 1). Tím se automaticky sestaví příkaz SQL SELECT , který se odešle do databáze při vyvolání metody SqlDataSource s Select() . Stejně jako v předchozím kurzu vyberte v rozevíracím seznamu tabulku Products (Produkty) a zkontrolujte ProductIDsloupce , ProductNamea UnitPrice .

Výběr sloupců, které se mají vrátit z tabulky nebo zobrazení

Obrázek 1: Výběr sloupců, které se mají vrátit z tabulky nebo zobrazení (kliknutím zobrazíte obrázek v plné velikosti)

Pokud chcete do příkazu zahrnout WHERE klauzuli SELECT , klikněte na WHERE tlačítko, které zobrazí dialogové okno Přidat WHERE klauzuli (viz obrázek 2). Pokud chcete přidat parametr, který omezí výsledky vrácené dotazem SELECT , zvolte nejprve sloupec, podle který chcete data filtrovat. Dále zvolte operátor, který se má použít pro filtrování (=, <, <=, >atd.). Nakonec zvolte zdroj hodnoty parametru s, například ze stavu řetězce dotazu nebo relace. Po nakonfigurování parametru klikněte na tlačítko Přidat a zahrňte ho do SELECT dotazu.

V tomto příkladu nechť vrátí pouze ty výsledky, ve kterých UnitPrice je hodnota menší nebo rovna 25,00 Kč. Proto vyberte UnitPrice z rozevíracího seznamu Sloupec a <= z rozevíracího seznamu Operátor. Pokud používáte pevně zakódovanou hodnotu parametru (například $25,00) nebo pokud chcete hodnotu parametru zadat programově, vyberte v rozevíracím seznamu Zdroj možnost Žádný. Dále zadejte pevně zakódovanou hodnotu parametru do textového pole Hodnota 25.00 a dokončete proces kliknutím na tlačítko Přidat.

Omezení výsledků vrácených z dialogového okna Přidat klauzuli WHERE

Obrázek 2: Omezení výsledků vrácených z dialogového okna Přidat WHERE klauzuli (kliknutím zobrazíte obrázek v plné velikosti)

Po přidání parametru se kliknutím na OK vraťte do průvodce Konfigurovat zdroj dat. Příkaz SELECT v dolní části průvodce by teď měl obsahovat klauzuli WHERE s parametrem s názvem @UnitPrice:

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

Poznámka

Pokud v klauzuli zadáte WHERE více podmínek z dialogového okna Přidat WHERE klauzuli, průvodce je spojí s operátorem AND . Pokud potřebujete do WHERE klauzule zahrnout (ORnapříklad WHERE UnitPrice <= @UnitPrice OR Discontinued = 1), musíte příkaz sestavit SELECT prostřednictvím obrazovky s vlastním příkazem SQL.

Dokončete konfiguraci SqlDataSource (klikněte na Další a pak na Dokončit) a pak zkontrolujte deklarativní kód SqlDataSource. Kód teď obsahuje kolekci <SelectParameters> , která uvádí zdroje parametrů v objektu SelectCommand.

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

Při vyvolání UnitPrice metody SqlDataSource s Select() se na parametr v SelectCommand před odesláním do databáze použije hodnota parametru @UnitPrice (25.00). Čistý výsledek je, že z Products tabulky se vrátí pouze produkty menší nebo rovné 25,00 Kč. Pokud to chcete potvrdit, přidejte na stránku Objekt GridView, vytvořte vazbu s tímto zdrojem dat a pak stránku zobrazte v prohlížeči. Měli byste vidět jenom ty produkty, které jsou menší než 25,00 USD nebo rovny, jak je na obrázku 3 vidět.

Zobrazí se pouze produkty menší než nebo rovné 25,00 Kč.

Obrázek 3: Zobrazí se pouze produkty menší než nebo rovné 25,00 USD (kliknutím zobrazíte obrázek v plné velikosti).

Krok 2: Přidání parametrů do vlastního příkazu SQL

Při přidávání vlastního příkazu SQL můžete explicitně zadat klauzuli WHERE nebo zadat hodnotu v buňce Filter v Tvůrci dotazů. Chcete-li to demonstrovat, pojďme zobrazit pouze ty produkty v GridView, jejichž ceny jsou nižší než určitá prahová hodnota. Začněte tím, že na ParameterizedQueries.aspx stránku přidáte TextBox, které tuto prahovou hodnotu shromáždí od uživatele. Vlastnost TextBox s ID nastavte na MaxPrice. Přidejte webový ovládací prvek Tlačítko a nastavte jeho Text vlastnost na Display Matching Products .

Dále přetáhněte objekt GridView na stránku a z jeho inteligentní značky vyberte, že chcete vytvořit nový zdroj dat Sql s názvem ProductsFilteredByPriceDataSource. V průvodci Konfigurovat zdroj dat přejděte na obrazovku Zadejte vlastní příkaz SQL nebo uloženou proceduru (viz Obrázek 4) a zadejte následující dotaz:

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

Po zadání dotazu (ručně nebo prostřednictvím Tvůrce dotazů) klikněte na Další.

Vrátit pouze produkty menší než nebo rovno hodnotě parametru

Obrázek 4: Vrátí pouze produkty, které jsou menší než nebo rovno hodnotě parametru (kliknutím zobrazíte obrázek v plné velikosti)

Vzhledem k tomu, že dotaz obsahuje parametry, zobrazí se na další obrazovce průvodce výzva k zadání zdroje hodnot parametrů. V rozevíracím seznamu Zdroj parametrů zvolte Control a MaxPrice (hodnota ovládacího prvku ID TextBox) z rozevíracího seznamu ControlID. Můžete také zadat volitelnou výchozí hodnotu, která se použije v případě, že uživatel nezadá do textového MaxPrice pole žádný text. V současné době nezadávejte výchozí hodnotu.

Vlastnost MaxPrice TextBox se používá jako zdroj parametru.

Obrázek 5: Vlastnost MaxPrice TextBox s Text slouží jako zdroj parametru (kliknutím zobrazíte obrázek v plné velikosti)

Dokončete průvodce Konfigurací zdroje dat kliknutím na Další a pak na Dokončit. Deklarativní značky pro GridView, TextBox, Button a SqlDataSource jsou následující:

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>

Všimněte si, že parametr v části SqlDataSource <SelectParameters> je ControlParameter, který obsahuje další vlastnosti, jako jsou ControlID a PropertyName. Při vyvolání ControlParameter metody SqlDataSource s Select() vezme hodnotu ze zadané vlastnosti webového ovládacího prvku a přiřadí ji k odpovídajícímu parametru SelectCommandv . V tomto příkladu se jako @MaxPrice hodnota parametru MaxPrice používá vlastnost s Text.

Chvilku si prohlédněte tuto stránku v prohlížeči. Při první návštěvě stránky nebo pokaždé, MaxPrice když TextBox chybí hodnota, nejsou zobrazeny žádné záznamy v GridView.

Pokud je textové pole MaxPrice prázdné, nezobrazují se žádné záznamy.

Obrázek 6: Při prázdném textovém MaxPrice poli se nezobrazují žádné záznamy (kliknutím zobrazíte obrázek v plné velikosti)

Důvodem, proč se nezobrazují žádné produkty, je to, že ve výchozím nastavení je prázdný řetězec pro hodnotu parametru převeden na hodnotu databáze NULL . Vzhledem k tomu, že se porovnání [UnitPrice] <= NULL vždy vyhodnotí jako Nepravda, nevrátí se žádné výsledky.

Do textového pole zadejte hodnotu, třeba 5,00, a klikněte na tlačítko Zobrazit odpovídající produkty. Při postbacku SqlDataSource informuje GridView, že se změnil jeden z jeho zdrojů parametrů. V důsledku toho GridView znovu napojí na SqlDataSource a zobrazí tyto produkty menší než nebo rovno $ 5.00.

Zobrazí se produkty menší než nebo rovno 5,00 USD.

Obrázek 7: Zobrazí se produkty menší než nebo rovno 5,00 USD (kliknutím zobrazíte obrázek v plné velikosti)

Počáteční zobrazení všech produktů

Místo zobrazování žádných produktů při prvním načtení stránky můžeme chtít zobrazit všechny produkty. Jedním ze způsobů, jak zobrazit seznam všech produktů pokaždé, když MaxPrice je TextBox prázdný, je nastavit výchozí hodnotu parametru na šíleně vysokou hodnotu, například 10000000, protože je nepravděpodobné, že Northwind Traders bude mít inventář, jehož jednotková cena překračuje 1 000 000 USD. Tento přístup je však krátkozraký a v jiných situacích nemusí fungovat.

V předchozích kurzech – Deklarativní parametry a filtrování hlavních a podrobných dat s rozevíracím seznamem jsme narazili na podobný problém. Naším řešením bylo umístit tuto logiku do vrstvy obchodní logiky. Konkrétně BLL prozkoumal příchozí hodnotu a pokud to byla NULL nebo nějaká rezervovaná hodnota, volání bylo směrováno na metodu DAL, která vrátila všechny záznamy. Pokud byla příchozí hodnota normální hodnotou filtrování, bylo provedeno volání metody DAL, která spustila příkaz SQL, který použil parametrizovanou WHERE klauzuli s zadanou hodnotou.

Při použití SqlDataSource bohužel architekturu vynecháme. Místo toho musíme přizpůsobit příkaz SQL tak, aby inteligentně chytil všechny záznamy, pokud @MaximumPrice je NULL parametr nebo nějaká rezervovaná hodnota. Pro účely tohoto cvičení ho řekněme, aby pokud @MaximumPrice je parametr roven -1.0hodnotě , měly by se vrátit všechny záznamy (-1.0 funguje jako rezervovaná hodnota, protože žádný součin nemůže mít zápornou UnitPrice hodnotu). K tomu můžeme použít následující příkaz SQL:

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

Tato WHERE klauzule vrátí všechny záznamy, pokud se @MaximumPrice parametr rovná -1.0. Pokud hodnota parametru není -1.0, vrátí se pouze produkty, jejichž UnitPrice hodnota parametru je menší nebo rovna @MaximumPrice . Když nastavíte výchozí hodnotu parametru @MaximumPrice na -1.0hodnotu , při načtení první stránky (nebo při každém MaxPrice prázdném textovém poli) @MaximumPrice bude mít hodnotu -1.0 a zobrazí se všechny produkty.

Nyní se zobrazí všechny produkty, když je textové pole MaxPrice prázdné.

Obrázek 8: Nyní se zobrazí všechny produkty, když MaxPrice je textové pole prázdné (kliknutím zobrazíte obrázek v plné velikosti)

U tohoto přístupu je potřeba si všimnout několika upozornění. Nejprve si uvědomte, že datový typ parametru s je odvozen jeho použitím v dotazu SQL. Pokud změníte klauzuli WHERE z @MaximumPrice = -1.0 na @MaximumPrice = -1, modul runtime zachází s parametrem jako s celočíselným číslem. Pokud se pak pokusíte přiřadit MaxPrice TextBox k desítkové hodnotě (například 5,00 ), dojde k chybě, protože nemůže převést hodnotu 5.00 na celé číslo. Pokud chcete tento problém napravit, buď se ujistěte, že používáte @MaximumPrice = -1.0 v WHERE klauzuli, nebo ještě lépe nastavte vlastnost objektu ControlParameter s Type na Desítkové .

Zadruhé, přidáním OR @MaximumPrice = -1.0 klauzule do WHERE klauzule nemůže dotazovací modul použít index UnitPrice (za předpokladu, že existuje), což vede ke kontrole tabulky. To může mít vliv na výkon, pokud je v Products tabulce dostatečně velký počet záznamů. Lepším řešením by bylo přesunout tuto logiku do uložené procedury, kde IF příkaz provede SELECT dotaz z Products tabulky bez klauzule, WHERE když je potřeba vrátit všechny záznamy, nebo ten, jehož WHERE klauzule obsahuje pouze UnitPrice kritéria, aby bylo možné použít index.

Krok 3: Vytvoření a použití parametrizovaných uložených procedur

Uložené procedury můžou obsahovat sadu vstupních parametrů, které se pak dají použít v příkazech SQL definovaných v rámci uložené procedury. Při konfiguraci SqlDataSource pro použití uložené procedury, která přijímá vstupní parametry, lze tyto hodnoty parametrů zadat pomocí stejných technik jako u ad hoc příkazů SQL.

Chcete-li ilustrovat použití uložených procedur v SqlDataSource, vytvořte novou uloženou proceduru v databázi Northwind s názvem GetProductsByCategory, která přijme parametr s názvem @CategoryID a vrátí všechny sloupce produktů, jejichž CategoryID sloupec odpovídá @CategoryID. Pokud chcete vytvořit uloženou proceduru, přejděte do Průzkumníka serveru a přejděte k podrobnostem databáze NORTHWND.MDF . (Pokud Průzkumník serveru nevidíte, otevřete ho tak, že přejdete do nabídky Zobrazení a vyberete možnost Průzkumník serveru.)

NORTHWND.MDF V databázi klikněte pravým tlačítkem na složku Uložené procedury, zvolte Přidat novou uloženou proceduru a zadejte následující syntaxi:

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

Kliknutím na ikonu Uložit (nebo Ctrl+S) uložte uloženou proceduru. Uloženou proceduru můžete otestovat tak, že na ni kliknete pravým tlačítkem ze složky Uložené procedury a zvolíte Provést. Zobrazí se výzva k zadání parametrů uložených procedur (@CategoryIDv tomto případě), po kterém se výsledky zobrazí v okně Výstup.

Uložená procedura GetProductsByCategory při spuštění s <span class=@CategoryID 1" />

Obrázek 9: Uložená GetProductsByCategory procedura při spuštění s @CategoryID 1 (kliknutím zobrazíte obrázek v plné velikosti)

Umožňuje použít tuto uloženou proceduru k zobrazení všech produktů v kategorii Nápoje v GridView. Přidejte na stránku nový objekt GridView a vytvořte vazbu k novému zdroji SqlDataSource s názvem BeverageProductsDataSource. Pokračujte na obrazovku Zadejte vlastní příkaz SQL nebo uloženou proceduru, vyberte přepínač Uložená procedura a v rozevíracím seznamu vyberte uloženou GetProductsByCategory proceduru.

V seznamu Drop-Down vyberte uloženou proceduru GetProductsByCategory.

Obrázek 10: Výběr GetProductsByCategory uložené procedury ze seznamu Drop-Down (kliknutím zobrazíte obrázek v plné velikosti)

Vzhledem k tomu, že uložená procedura přijímá vstupní parametr (@CategoryID), zobrazí se po kliknutí na tlačítko Další výzva k zadání zdroje pro tuto hodnotu parametru. Nápoj je CategoryID 1, proto ponechte rozevírací seznam Zdroj parametrů na none a do textového pole DefaultValue zadejte hodnotu 1.

Použití Hard-Coded hodnoty 1 k vrácení produktů v kategorii Nápoje

Obrázek 11: Použití Hard-Coded hodnoty 1 k vrácení produktů v kategorii Nápoje (kliknutím zobrazíte obrázek v plné velikosti)

Jak ukazuje následující deklarativní kód, při použití uložené procedury je vlastnost SqlDataSource s SelectCommand nastavena na název uložené procedury a SelectCommandType vlastnost je nastavena na StoredProcedurehodnotu , což znamená, že SelectCommand je název uložené procedury, nikoli ad hoc příkazu SQL.

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

Otestujte stránku v prohlížeči. Zobrazí se pouze produkty, které patří do kategorie Nápoje, i když jsou zobrazena všechna pole produktů, protože GetProductsByCategory uložená procedura vrátí všechny sloupce z Products tabulky. Samozřejmě bychom mohli omezit nebo přizpůsobit pole zobrazená v zobrazení GridView z dialogového okna GridView s Upravit sloupce.

Všechny nápoje jsou zobrazeny

Obrázek 12: Zobrazí se všechny nápoje (kliknutím zobrazíte obrázek v plné velikosti)

Krok 4: Vyvolání příkazu Select() zdroje SqlDataSource prostřednictvím kódu programu

Příklady, které jsme viděli v předchozím kurzu a zatím v tomto kurzu, vázaly ovládací prvky SqlDataSource přímo na GridView. Data ovládacího prvku SqlDataSource však mohou být programově přístupná a výčty v kódu. To může být užitečné zejména v případě, že potřebujete dotazovat data, abyste je mohli zkontrolovat, ale nemusíte je zobrazovat. Místo toho, abyste museli psát všechny často používané ADO.NET kód pro připojení k databázi, zadat příkaz a načíst výsledky, můžete nechat sqldatasource zpracovat tento monotónní kód.

Pro ilustraci práce s daty SqlDataSource s programově si představte, že vás nadřízený oslovil s žádostí o vytvoření webové stránky, která zobrazí název náhodně vybrané kategorie a přidružené produkty. To znamená, že když uživatel navštíví tuto stránku, chceme náhodně vybrat kategorii z Categories tabulky, zobrazit název kategorie a pak vypsat produkty, které do této kategorie patří.

K tomu potřebujeme dva ovládací prvky SqlDataSource, jeden pro získání náhodné kategorie z Categories tabulky a druhý pro získání produktů kategorií. Vytvoříme SqlDataSource, který v tomto kroku načte náhodný záznam kategorie. Krok 5 se zabývá vytvářením sqldatasource, který načítá produkty kategorie s.

Začněte přidáním SqlDataSource do ParameterizedQueries.aspx a nastavte ho ID na RandomCategoryDataSource. Nakonfigurujte ho tak, aby používal následující dotaz SQL:

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

ORDER BY NEWID() vrátí záznamy seřazené v náhodném pořadí (viz Použití NEWID() k náhodnému řazení záznamů). SELECT TOP 1 vrátí první záznam ze sady výsledků. V souhrnu CategoryID tento dotaz vrátí hodnoty sloupců a CategoryName z jedné náhodně vybrané kategorie.

Chcete-li zobrazit hodnotu kategorie CategoryName , přidejte na stránku ovládací prvek Label Web, nastavte jeho ID vlastnost na CategoryNameLabela vymažte jeho Text vlastnost. Pokud chcete programově načíst data z ovládacího prvku SqlDataSource, musíme vyvolat jeho Select() metodu. MetodaSelect() očekává jeden vstupní parametr typu DataSourceSelectArguments, který určuje, jak se mají data před vrácením generovat. To může zahrnovat pokyny pro řazení a filtrování dat a používá se ovládacími prvky dat web při řazení nebo stránkování dat z ovládacího prvku SqlDataSource. V našem příkladu ale nepotřebujeme, aby se data před vrácením upravila, a proto objekt předáme DataSourceSelectArguments.Empty .

Metoda Select() vrátí objekt, který implementuje IEnumerable. Přesný vrácený typ závisí na hodnotě vlastnosti ovládacího prvku DataSourceModeSqlDataSource. Jak bylo popsáno v předchozím kurzu, tato vlastnost může být nastavena na hodnotu nebo DataSetDataReader. Pokud je nastavená na DataSet, Select() vrátí metoda objekt DataView ; pokud je nastavená na DataReader, vrátí objekt, který implementuje IDataReader. Vzhledem k tomu, RandomCategoryDataSource že SqlDataSource má vlastnost DataSourceMode nastavenou na DataSet (výchozí), budeme pracovat s objektem DataView.

Následující kód ukazuje, jak načíst záznamy z RandomCategoryDataSource SqlDataSource jako DataView a jak číst CategoryName hodnotu sloupce z prvního řádku DataView:

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] vrátí první DataRowView v zobrazení DataView. randomCategoryView[0]["CategoryName"] vrátí hodnotu sloupce v CategoryName tomto prvním řádku. Všimněte si, že DataView je volně napsaný. Abychom mohli odkazovat na konkrétní hodnotu sloupce, musíme předat název sloupce jako řetězec (v tomto případě CategoryName). Obrázek 13 znázorňuje zprávu zobrazenou CategoryNameLabel na stránce při prohlížení stránky. Při každé návštěvě stránky (včetně zpětného odeslání) samozřejmě sqldatasource náhodně vybere RandomCategoryDataSource skutečný zobrazovaný název kategorie.

Zobrazí se název náhodně vybrané kategorie.

Obrázek 13: Zobrazí se název náhodně vybrané kategorie (kliknutím zobrazíte obrázek v plné velikosti).

Poznámka

Pokud by vlastnost s ovládacího prvku DataSourceMode SqlDataSource byla nastavena na DataReaderhodnotu , bylo by nutné přetypovat návratovou hodnotu z Select() metody na IDataReader. K načtení CategoryName hodnoty sloupce z prvního řádku použijeme následující kód:

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

Když SqlDataSource náhodně vybírá kategorii, jsme připraveni přidat GridView se seznamem produktů kategorií.

Poznámka

Místo použití ovládacího prvku Label Web k zobrazení názvu kategorie jsme mohli přidat FormView nebo DetailsView na stránku a vytvořit vazbu na SqlDataSource. Použití labelu nám ale umožnilo prozkoumat, jak programově vyvolat příkaz SqlDataSource s Select() a pracovat s jeho výslednými daty v kódu.

Krok 5: Programové přiřazení hodnot parametrů

Všechny příklady, které jsme zatím v tomto kurzu viděli, používají buď pevně zakódovanou hodnotu parametru, nebo hodnotu převzatou z některého z předdefinovaných zdrojů parametrů (hodnota řetězce dotazu, webový ovládací prvek na stránce atd.). Parametry ovládacích prvků SqlDataSource s však lze nastavit také programově. K dokončení našeho aktuálního příkladu potřebujeme SqlDataSource, který vrací všechny produkty patřící do zadané kategorie. Tento SqlDataSource bude mít CategoryID parametr, jehož hodnota musí být nastavena na CategoryID základě hodnoty sloupce vrácené RandomCategoryDataSource SqlDataSource v obslužné rutině Page_Load události.

Začněte tím, že na stránku přidáte objekt GridView a svážete ho s novým zdrojem SqlDataSource s názvem ProductsByCategoryDataSource. Podobně jako v kroku 3 nakonfigurujte SqlDataSource tak, aby vyvolal uloženou proceduru GetProductsByCategory . Rozevírací seznam Zdroj parametrů nechte nastavený na Hodnotu Žádný, ale nezadávejte výchozí hodnotu, protože tuto výchozí hodnotu nastavíme programově.

Snímek obrazovky s oknem Konfigurovat zdroj dat se zdrojem parametrů nastaveným na None

Obrázek 14: Nezadávejte zdroj parametrů nebo výchozí hodnotu (kliknutím zobrazíte obrázek v plné velikosti)

Po dokončení průvodce SqlDataSource by měl výsledný deklarativní kód vypadat nějak takto:

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

Parametr můžeme přiřadit DefaultValueCategoryID programově v obslužné rutině Page_Load události:

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

S tímto přidáním stránka obsahuje GridView, který zobrazuje produkty přidružené k náhodně vybrané kategorii.

Snímek obrazovky se stránkou Vaše náhodně vybraná kategorie

Obrázek 15: Nezadávejte zdroj parametrů nebo výchozí hodnotu (kliknutím zobrazíte obrázek v plné velikosti)

Souhrn

SqlDataSource umožňuje vývojářům stránek definovat parametrizované dotazy, jejichž hodnoty parametrů mohou být pevně zakódované, načítané z předdefinovaných zdrojů parametrů nebo přiřazené programově. V tomto kurzu jsme viděli, jak vytvořit parametrizovaný dotaz z průvodce Konfigurovat zdroj dat pro ad hoc dotazy SQL i uložené procedury. Podívali jsme se také na použití pevně zakódovaných zdrojů parametrů, webového ovládacího prvku jako zdroje parametrů a programového určení hodnoty parametru.

Stejně jako u ObjectDataSource i SqlDataSource poskytuje možnosti pro úpravu podkladových dat. V dalším kurzu se podíváme na to, jak definovat INSERTpříkazy , UPDATEa DELETE pomocí SqlDataSource. Po přidání těchto příkazů můžeme využít integrované funkce pro vkládání, úpravy a odstraňování, které jsou součástí ovládacích prvků GridView, DetailsView a FormView.

Šťastné programování!

O autorovi

Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho najít na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na http://ScottOnWriting.NETadrese .

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty tohoto kurzu byli Scott Clyde, Randell Schmidt a Ken Pespisa. Chcete si projít moje nadcházející články na WEBU MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.comadresu .