Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto kurzu pokračujeme v pohledu na ovládací prvek SqlDataSource a naučíme se definovat parametrizované dotazy. Parametry lze 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 tutoriálu jsme viděli, jak pomocí ovládacího prvku SqlDataSource načíst data přímo z databáze. Pomocí průvodce konfigurací zdroje dat bychom mohli vybrat databázi a poté buď: vybrat sloupce, které chcete vrátit z tabulky nebo zobrazení; zadat vlastní příkaz SQL; nebo použijte uloženou proceduru. Bez ohledu na to, zda vybíráte sloupce z tabulky nebo zobrazení nebo zadáváte vlastní příkaz SQL, je vlastnosti ovládacího prvku SelectCommand SqlDataSource s přiřazen výsledný ad-hoc příkaz SQL SELECT a je to právě tento SELECT příkaz, který je proveden při vyvolání metody SqlDataSource s 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.
SELECT V příkazu lze klauzuli WHERE použít k omezení vrácených výsledků. Chcete-li například zobrazit názvy produktů, které stojí více než 50,00 USD, můžeme použít následující dotaz:
SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00
Hodnoty použité v WHERE klauzuli jsou obvykle určeny nějakým externím zdrojem, jako je například hodnota řetězce dotazu, proměnná relace nebo uživatelský vstup z webového ovládacího prvku na stránce. V ideálním případě jsou takové vstupy specifikovány pomocí parametrů. U Microsoft SQL Serveru se parametry označují pomocí @parameterName, jako v:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource podporuje parametrizované dotazy, a to jak pro příkazy, tak SELECTpro INSERT příkazy , UPDATEa .DELETE Kromě toho lze hodnoty parametrů automaticky získávat z různých zdrojů: řetězec dotazu, stav relace, ovládací prvky na stránce atd., nebo je lze přiřadit programově. V tomto tutoriálu 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 v prvních 46 kurzech s SqlDataSource, a zaznamenali jsme jejich koncepční podobnosti. Tyto podobnosti se vztahují i na parametry. Parametry prvku ObjectDataSource jsou namapovány na vstupní parametry pro metody ve vrstvě obchodní logiky. U SqlDataSource jsou parametry definovány přímo v dotazu SQL. Oba ovládací prvky mají kolekce parametrů pro své Select(), Insert(), Update(), a Delete() metody a oba mohou mít tyto hodnoty parametrů naplněné z předdefinovaných zdrojů (hodnoty řetězců dotazů, proměnné relace atd.) nebo přiřazené programově.
Vytvoření parametrizovaného dotazu
Průvodce konfigurací zdroje dat ovládacího prvku SqlDataSource nabízí tři způsoby definování příkazu, který se má spustit pro načtení záznamů databáze:
- Výběrem sloupců z existující tabulky nebo zobrazení
- Zadáním vlastního SQL příkazu, nebo
- Výběrem uložené procedury
Při výběru sloupců z existující tabulky nebo zobrazení je nutné zadat parametry WHERE klauzule v dialogovém okně Přidat WHERE klauzuli. Při vytváření vlastního SQL příkazu však můžete parametry zadat přímo do WHERE klauzule (using @parameterName k označení každého parametru). 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 však musí být předány jako vstupní parametry do uložené procedury.
Vzhledem k tomu, že vytvoření parametrizovaného dotazu závisí na tom, jak je zadán SqlDataSource s SelectCommand , pojďme se podívat na všechny tři přístupy. Začněte tím, že otevřete ParameterizedQueries.aspx stránku ve složce SqlDataSource , přetáhnete ovládací prvek SqlDataSource z panelu nástrojů do Návrháře a nastavíte jej ID na Products25BucksAndUnderDataSource. Dále klikněte na odkaz Konfigurovat zdroj dat z inteligentní značky ovládacího prvku. Vyberte databázi, kterou chcete použít (NORTHWINDConnectionString) a klikněte na tlačítko 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 vytvoří příkaz SQL SELECT , což je to, co se odešle do databáze při vyvolání metody SqlDataSource s Select() . Stejně jako v předchozím výukovém programu vyberte v rozevíracím seznamu tabulku Produkty a zaškrtněte ProductIDsloupce , ProductNamea UnitPrice .
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)
Chcete-li WHERE do příkazu zahrnout SELECT klauzuli, klikněte na WHERE tlačítko, které vyvolá dialogové okno Přidat WHERE klauzuli (viz obrázek 2). Chcete-li přidat parametr pro omezení výsledků vrácených dotazem SELECT , nejprve vyberte sloupec, podle kterého chcete data filtrovat. Dále vyberte operátor, který chcete použít pro filtrování (=, <<, =, >atd.). Nakonec vyberte zdroj hodnoty parametru s, například z řetězce dotazu nebo stavu relace. Po nakonfigurování parametru klikněte na tlačítko Přidat, abyste jej zahrnuli do dotazu SELECT .
V tomto příkladu vrátíme pouze ty výsledky, jejichž hodnota UnitPrice je menší nebo rovna 25,00 USD. Vyberte UnitPrice proto 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 má být hodnota parametru určena programově, vyberte None z rozevíracího seznamu Zdroj. 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.
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 tlačítko OK vraťte do průvodce konfigurací zdroje dat. Příkaz SELECT v dolní části průvodce by nyní měl obsahovat WHERE klauzuli s parametrem s názvem @UnitPrice:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Poznámka:
Pokud v WHERE klauzuli v dialogovém okně Přidat WHERE klauzuli zadáte více podmínek, průvodce je spojí s operátorem AND . Pokud potřebujete do OR klauzule zahrnout an WHERE (například WHERE UnitPrice <= @UnitPrice OR Discontinued = 1), musíte příkaz vytvořit SELECT prostřednictvím obrazovky vlastního příkazu SQL.
Dokončete konfiguraci zdroje SqlDataSource (klikněte na tlačítko Další a poté na Dokončit) a poté zkontrolujte deklarativní kód SqlDataSource. Značky nyní obsahují <SelectParameters> kolekci, která vysvětluje zdroje parametrů v rozhraní 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í metody SqlDataSource s Select() se hodnota parametru UnitPrice (25.00) použije na @UnitPrice parametr před SelectCommand odesláním do databáze. Čistým výsledkem je, že z tabulky jsou vráceny Products pouze ty produkty, které jsou nižší nebo rovny 25,00 USD. Chcete-li to potvrdit, přidejte na stránku prvek GridView, navažte jej k tomuto zdroji dat a poté zobrazte stránku v prohlížeči. Měli byste vidět pouze ty produkty, které jsou nižší nebo rovny 25,00 USD, jak potvrzuje obrázek 3.
Obrázek 3: Zobrazí se pouze produkty s cenou 25,00 USD nebo menší (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 klauzuli WHERE zadat explicitně nebo zadat hodnotu v buňce Filtr v Tvůrci dotazů. Abychom to demonstrovali, zobrazíme v prvku GridView pouze ty produkty, jejichž ceny jsou menší než určitá prahová hodnota. Začněte přidáním textového pole na ParameterizedQueries.aspx stránku, abyste od uživatele shromáždili tuto prahovou hodnotu. Nastavte vlastnost TextBox s ID na MaxPrice. Přidejte webový ovládací prvek Tlačítko a nastavte jeho Text vlastnost na Zobrazit odpovídající produkty .
Dále přetáhněte prvek GridView na stránku a z jeho inteligentní značky zvolte vytvoření nového prvku SqlDataSource s názvem ProductsFilteredByPriceDataSource. V průvodci konfigurací zdroje dat přejděte na obrazovku Určení vlastního příkazu SQL nebo uložené procedury (viz obrázek 4) a zadejte následující dotaz:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
Po zadání dotazu (buď ručně, nebo pomocí Tvůrce dotazů) klikněte na tlačítko Další.
Obrázek 4: Vrátí pouze ty produkty, které jsou menší nebo rovny hodnotě parametru (kliknutím zobrazíte obrázek v plné velikosti).
Vzhledem k tomu, že dotaz obsahuje parametry, na další obrazovce průvodce se zobrazí výzva k zadání zdroje hodnot parametrů. Vyberte možnost Ovládací prvek z rozevíracího seznamu Zdroj parametrů a MaxPrice (hodnota ovládacího prvku ID Textové pole) z rozevíracího seznamu ControlID. Můžete také zadat volitelnou výchozí hodnotu, která se použije v případě, že uživatel nezadal do textového pole žádný text MaxPrice . Prozatím nezadávejte výchozí hodnotu.
Obrázek 5: MaxPrice Vlastnost TextBox s Text se používá jako zdroj parametrů (kliknutím zobrazíte obrázek v plné velikosti).
Dokončete průvodce konfigurací zdroje dat kliknutím na tlačítko Další a poté na tlačítko Dokončit. Deklarativní kód pro GridView, TextBox, Button a SqlDataSource následuje:
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 s <SelectParameters> je , ControlParameterkterý obsahuje další vlastnosti jako ControlID a PropertyName. Když je vyvolána metoda SqlDataSource sSelect(), ControlParameter získá hodnotu ze zadané vlastnosti webového ovládacího prvku a přiřadí ji odpovídajícímu parametru v .SelectCommand V tomto příkladu MaxPrice je jako hodnota parametru @MaxPrice použita vlastnost s Text.
Udělejte si chvilku a prohlédněte si tuto stránku v prohlížeči. Při první návštěvě stránky nebo vždy, když v MaxPrice textovém poli chybí hodnota, se v prvku GridView nezobrazí žádné záznamy.
Obrázek 6: Pokud je textové pole prázdné, MaxPrice nezobrazí se žá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 porovnání je vždy vyhodnoceno [UnitPrice] <= NULL jako False, nejsou vráceny žádné výsledky.
Do textového pole zadejte hodnotu, například 5,00, a klikněte na tlačítko Zobrazit odpovídající produkty. Při zpětném odeslání SqlDataSource informuje prvek GridView, že se změnil jeden z jeho zdrojů parametrů. V důsledku toho se prvek GridView znovu naváže na SqlDataSource a zobrazí tyto produkty menší nebo rovné 5,00 USD.
Obrázek 7: Zobrazí se produkty menší nebo rovné 5,00 USD (kliknutím zobrazíte obrázek v plné velikosti)
Počáteční zobrazení všech produktů
Namísto zobrazení žá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 vypsat všechny produkty, kdykoli MaxPrice je textové pole prázdné, je nastavit výchozí hodnotu parametru na nějakou šíleně vysokou hodnotu, například 1000000, protože je nepravděpodobné, že Northwind Traders bude mít někdy zásoby, jejichž jednotková cena přesahuje 1 000 000 USD. Tento přístup je však krátkozraký a v jiných situacích nemusí fungovat.
V předchozích tutoriálech - Deklarativní parametry a filtrování hlavních/podrobností Pomocí DropDownList jsme se potýkali s podobným problémem. Naším řešením bylo vložit tuto logiku do vrstvy Business Logic. Konkrétně knihovna BLL prozkoumala příchozí hodnotu, a pokud se jednalo NULL o nějakou rezervovanou hodnotu, bylo volání směrováno na metodu DAL, která vrátila všechny záznamy. Pokud byla vstupní hodnota normální hodnotou filtrování, bylo provedeno volání metody DAL, která provedla příkaz SQL, který používal parametrizovanou WHERE klauzuli se zadanou hodnotou.
Architekturu bohužel obcházíme při použití SqlDataSource. Místo toho musíme přizpůsobit příkaz SQL tak, aby inteligentně zachytil všechny záznamy, pokud @MaximumPrice je NULL parametr nebo nějaká vyhrazená hodnota. Pro toto cvičení to uchovejme tak, že pokud @MaximumPrice je parametr roven -1.0, pak se vrátí všechny záznamy (-1.0 funguje jako rezervovaná hodnota, protože žádný produkt 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 vrací všechny záznamy, pokud je @MaximumPriceparametr -1.0 roven . Pokud hodnota parametru není -1.0, vrátí se pouze ty produkty, které UnitPrice jsou menší nebo rovny hodnotě parametru @MaximumPrice . Nastavením výchozí hodnoty parametru @MaximumPrice na -1.0, při prvním načtení stránky (nebo vždy, když MaxPrice je textové pole prázdné), @MaximumPrice bude mít hodnotu -1.0 a zobrazí se všechny produkty.
Obrázek 8: Nyní se zobrazují všechny produkty, když je textové pole prázdné MaxPrice (kliknutím zobrazíte obrázek v plné velikosti).
U tohoto přístupu je třeba si uvědomit několik upozornění. Nejprve si uvědomte, že datový typ parametru s je odvozen z jeho použití v dotazu SQL. Pokud změníte klauzuli WHERE z @MaximumPrice = -1.0 na @MaximumPrice = -1, běhové prostředí bude s parametrem zacházet jako s celým číslem. Pokud se pak pokusíte MaxPrice přiřadit textové pole k desítkové hodnotě (například 5,00 ), dojde k chybě, protože nelze převést 5,00 na celé číslo. Chcete-li to napravit, buď se ujistěte, že používáte @MaximumPrice = -1.0 v WHERE klauzuli, nebo ještě lépe, nastavte ControlParameter vlastnost objektu s Type na Decimal .
Za druhé, přidáním the OR @MaximumPrice = -1.0 do WHERE klauzule nemůže dotazovací stroj použít index on UnitPrice (za předpokladu, že existuje), což vede k prohledání tabulky. To může mít vliv na výkon, pokud je v tabulce dostatečně velký počet záznamů Products . Lepším přístupem by bylo přesunout tuto logiku do uložené procedury, kde IF by příkaz buď provedl SELECT dotaz z Products tabulky bez WHERE klauzule, když je třeba vrátit všechny záznamy, nebo příkaz, jehož WHERE klauzule obsahuje pouze kritéria UnitPrice , aby bylo možné použít index.
Krok 3: Vytváření a používání parametrizovaných uložených procedur
Uložené procedury mohou obsahovat sadu vstupních parametrů, které pak mohou být použity v SQL příkazech definovaných v rámci uložené procedury. Při konfiguraci zdroje 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.
Pro ilustraci použití uložených procedur v SqlDataSource vytvoříme novou uloženou proceduru v databázi Northwind s názvem GetProductsByCategory, která přijímá parametr s názvem @CategoryID a vrací všechny sloupce produktů, jejichž CategoryID sloupec odpovídá @CategoryID. Chcete-li vytvořit uloženou proceduru, přejděte do Průzkumníka serveru a přejděte k podrobnostem NORTHWND.MDF databáze. (Pokud Průzkumník serveru nevidíte, vyvolejte ho tak, že přejdete do nabídky Zobrazit a vyberete možnost Průzkumník serveru.)
V NORTHWND.MDF databázi klikněte pravým tlačítkem myši 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ženou proceduru uložte. Uloženou proceduru můžete otestovat tak, že na ni kliknete pravým tlačítkem myši ze složky Uložené procedury a vyberete příkaz Spustit. Zobrazí se výzva k zadání parametrů uložené procedury (@CategoryIDv tomto případě), po jejímž uplynutí se výsledky zobrazí v okně Výstup.
Obrázek 9: Uložená procedura GetProductsByCategory při spuštění s hodnotou 1 @CategoryID (kliknutím zobrazíte obrázek v plné velikosti)
Pojďme použít tuto uloženou proceduru k zobrazení všech produktů v kategorii Nápoje v prvku GridView. Přidejte na stránku nový prvek GridView a svažte ho s novým zdrojem SqlDataSource s názvem BeverageProductsDataSource. Pokračujte na obrazovku Určete vlastní příkaz SQL nebo uloženou proceduru, vyberte přepínač Uložená procedura a z rozevíracího seznamu vyberte uloženou proceduru GetProductsByCategory .
Obrázek 10: Výběr uložené procedury GetProductsByCategory 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), kliknutím na tlačítko Další se zobrazí výzva k zadání zdroje pro hodnotu tohoto parametru. Hodnota Nápoje CategoryID je 1, proto ponechte rozevírací seznam Zdroj parametrů na Žádný a do textového pole DefaultValue zadejte hodnotu 1.
Obrázek 11: Použití hodnoty Hard-Coded 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 vlastnost je nastavena SelectCommandType na StoredProcedure, což znamená, že se SelectCommand jedná o název uložené procedury, nikoli o ad-hoc příkaz 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 ty produkty, které patří do kategorie Nápoje, i když jsou zobrazena všechna pole produktů, protože uložená procedura GetProductsByCategory vrací všechny sloupce z Products tabulky. Samozřejmě bychom mohli omezit nebo přizpůsobit pole zobrazená v prvku GridView z dialogového okna Upravit sloupce prvku GridView.
Obrázek 12: Jsou zobrazeny všechny nápoje (kliknutím zobrazíte obrázek v plné velikosti)
Krok 4: Programové vyvolání příkazu select() zdroje SqlDataSource
Příklady, které jsme viděli v předchozím kurzu a v tomto kurzu, zatím svázaly ovládací prvky SqlDataSource přímo s prvkem GridView. K datům ovládacího prvku SqlDataSource však lze programově přistupovat a vytvořit jejich výčet v kódu. To může být užitečné zejména v případě, že potřebujete zadat dotaz na data, abyste je mohli zkontrolovat, ale nepotřebujete je zobrazit. Místo toho, abyste museli psát veškerý často používaný kód ADO.NET pro připojení k databázi, zadání příkazu a načtení výsledků, můžete nechat SqlDataSource zpracovat tento monotónní kód.
Pro ilustraci práce s daty SqlDataSource programově si představte, že se na vás váš šéf obrátil s požadavkem na vytvoření webové stránky, která zobrazuje název náhodně vybrané kategorie a jejích přidružených produktů. 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 poté zobrazit seznam produktů patřících do této kategorie.
K tomu potřebujeme dva ovládací prvky SqlDataSource, jeden pro převzetí náhodné kategorie z Categories tabulky a druhý pro získání produktů kategorie s. V tomto kroku sestavíme SqlDataSource, který načte náhodný záznam kategorie. Krok 5 se zabývá vytvořením prvku SqlDataSource, který načte produkty kategorie s.
Začněte přidáním prvku SqlDataSource do ParameterizedQueries.aspx a nastavte jej ID na RandomCategoryDataSource. Nakonfigurujte jej tak, aby používal následující SQL dotaz:
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ů. Dohromady tento dotaz vrátí hodnoty sloupce CategoryID 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 a CategoryNameLabelvymažte jeho Text vlastnost. Chcete-li 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 mají být data odeslána před vrácením. To může zahrnovat pokyny k řazení a filtrování dat a je používáno webovými ovládacími prvky dat při řazení nebo stránkování dat z ovládacího prvku SqlDataSource. V našem příkladu však nepotřebujeme, aby se data před vrácením měnila, a proto objekt předáme DataSourceSelectArguments.Empty .
Metoda Select() vrací objekt, který implementuje IEnumerable. Vrácený přesný typ závisí na hodnotě vlastnosti ovládacího prvku DataSourceModeSqlDataSource. Jak bylo popsáno v předchozím výukovém programu, tuto vlastnost lze nastavit na hodnotu buď DataSet nebo DataReader. Pokud je nastaveno na DataSet, Select() metoda vrací objekt DataView ; pokud je nastaveno na DataReader, vrací objekt, který implementuje IDataReader. Vzhledem k tomu, RandomCategoryDataSource že SqlDataSource má svou DataSourceMode vlastnost 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 hodnotu sloupce CategoryName 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 objektu DataView.
randomCategoryView[0]["CategoryName"] Vrátí hodnotu sloupce CategoryName v tomto prvním řádku. Všimněte si, že DataView je volně typovaný. 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 ukazuje zprávu zobrazenou v dialogovém okně CategoryNameLabel při prohlížení stránky. Samozřejmě, že skutečný zobrazený název kategorie je náhodně vybrán RandomCategoryDataSource SqlDataSource při každé návštěvě stránky (včetně postbacků).
Obrázek 13: Zobrazí se název náhodně vybrané kategorie s (kliknutím zobrazíte obrázek v plné velikosti)
Poznámka:
Pokud by byla vlastnost ovládacího prvku SqlDataSource nastavena DataSourceMode na DataReader, návratová hodnota z Select() metody by musela být přetypována na IDataReader. Pro načtení CategoryName hodnoty sloupce z prvního řádku bychom použili kód jako:
if (randomCategoryReader.Read())
{
string categoryName = randomCategoryReader["CategoryName"].ToString();
...
}
Když SqlDataSource náhodně vybere kategorii, jsme připraveni přidat prvek GridView, který obsahuje seznam produktů kategorie s.
Poznámka:
Místo použití webového ovládacího prvku Label k zobrazení názvu kategorie jsme mohli na stránku přidat FormView nebo DetailsView a svázat ho s SqlDataSource. Použití Label 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 dosud viděli v tomto kurzu, používaly buď pevně zakódovanou hodnotu parametru, nebo hodnotu převzatou z jednoho z předdefinovaných zdrojů parametrů (hodnota řetězce dotazu, webový ovládací prvek na stránce atd.). Parametry ovládacího prvku SqlDataSource však lze nastavit také programově. Abychom dokončili náš aktuální příklad, potřebujeme SqlDataSource, který vrací všechny produkty patřící do zadané kategorie. Tento SqlDataSource bude mít parametr, jehož hodnota musí být nastavena CategoryID na základě hodnoty sloupce CategoryID vrácené RandomCategoryDataSource SqlDataSource v obslužné rutině Page_Load události.
Začněte přidáním prvku GridView na stránku a jeho svázáním s novým zdrojem SqlDataSource s názvem ProductsByCategoryDataSource. Podobně jako v kroku 3 nakonfigurujte SqlDataSource tak, aby vyvolal uloženou proceduru GetProductsByCategory . Ponechte rozevírací seznam Zdroj parametrů nastavený na Žádný, ale nezadávejte výchozí hodnotu, protože tuto výchozí hodnotu nastavíme programově.
Obrázek 14: Nezadávejte zdroj parametrů ani výchozí hodnotu (kliknutím zobrazíte obrázek v plné velikosti)
Po dokončení průvodce SqlDataSource by výsledný deklarativní kód měl vypadat podobně jako následující:
<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
Parametr DefaultValue můžeme přiřadit CategoryID 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 prvek GridView, který zobrazuje produkty přidružené k náhodně vybrané kategorii.
Obrázek 15: Nezadávejte zdroj parametrů ani výchozí hodnotu (kliknutím zobrazíte obrázek v plné velikosti)
Shrnutí
SqlDataSource umožňuje vývojářům stránek definovat parametrizované dotazy, jejichž hodnoty parametrů mohou být pevně zakódované, načtené 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 konfigurací zdroje 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.
Podobně jako u prvku ObjectDataSource poskytuje prvek SqlDataSource také možnosti úpravy podkladových dat. V dalším tutoriálu 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 vkládání, úprav 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 ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams: Nauč se ASP.NET 2.0 za 24 hodin. Může být dosažitelný na mitchell@4GuysFromRolla.comadrese .
Zvláštní díky
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí recenzenti tohoto kurzu byli Scott Clyde, Randell Schmidt a Ken Pespisa. Chcete si projít nadcházející články MSDN? Pokud ano, napište mi zprávu na mitchell@4GuysFromRolla.com.
@CategoryID 1" />