Použití parametrizovaných dotazů s ovládacím prvkem SqlDataSource (C#)
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 INSERT
to jak pro příkazy, tak pro SELECT
příkazy , UPDATE
a 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 ProductID
sloupce , ProductName
a 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)
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.
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 (OR
napří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.
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ší.
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.
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 SelectCommand
v . 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.
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.
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.0
hodnotě , 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.0
hodnotu , 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.
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 (@CategoryID
v tomto případě), po kterém se výsledky zobrazí v okně Výstup.
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.
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.
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 StoredProcedure
hodnotu , 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.
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 CategoryNameLabel
a 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 DataSourceMode
SqlDataSource. Jak bylo popsáno v předchozím kurzu, tato vlastnost může být nastavena na hodnotu nebo DataSet
DataReader
. 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.
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 DataReader
hodnotu , 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ě.
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 DefaultValue
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 GridView, který zobrazuje produkty přidružené k náhodně vybrané kategorii.
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 INSERT
příkazy , UPDATE
a 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 .