Použití parametrizovaných dotazů s ovládacím prvkem SqlDataSource (VB)
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 dotazovací řetězec, 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 bychom mohli zvolit databázi a pak buď: vybrat sloupce, které se mají vrátit z tabulky nebo zobrazení; Zadejte vlastní příkaz SQL; nebo použijte uloženou proceduru. Ať už vyberete sloupce z tabulky nebo zobrazení nebo zadáte vlastní příkaz SQL, vlastnost s SelectCommand
ovládacího prvku SqlDataSource je přiřazena výslednému ad hoc příkazu SQL SELECT
a je to tento SELECT
příkaz, který se spustí 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 chybí 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 zadají pomocí parametrů. U microsoft SQL Server 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 pro SELECT
INSERT
příkazy , UPDATE
a DELETE
. Kromě toho je možné hodnoty parametrů automaticky načíst z různých zdrojů, jako je ř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 výběru v prvních 46 kurzech s SqlDataSource, a zaznamenali jejich koncepční podobnosti. Tyto podobnosti se vztahují také na parametry. Parametry ObjectDataSource s mapované na vstupní parametry pro metody ve vrstvě obchodní logiky. Pomocí 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 a Delete()
oba můžou mít tyto hodnoty parametrů vyplněné z předdefinovaných zdrojů (hodnoty řetězce dotazů, 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 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 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 klauzule WHERE
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
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 však musí být předány jako vstupní parametry uložené proceduře.
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 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, umožňuje průvodce Konfigurovat zdroj dat 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 a zkontrolujte ProductID
sloupce , ProductName
a UnitPrice
.
Obrázek 1: Výběr sloupců, které chcete 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 pro omezení výsledků vrácených SELECT
dotazem, nejprve zvolte 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 konfiguraci parametru klikněte na tlačítko Přidat, abyste ho zahrnuli do SELECT
dotazu.
V tomto příkladu nechť vrátí pouze ty výsledky, u UnitPrice
kterých 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 má být hodnota parametru určena 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 WHERE
klauzuli s parametrem s názvem @UnitPrice
:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Poznámka
Pokud v klauzuli WHERE
zadáte 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 objekt OR
(například WHERE UnitPrice <= @UnitPrice OR Discontinued = 1
), musíte vytvořit SELECT
příkaz prostřednictvím obrazovky s vlastními příkazy SQL.
Dokončete konfiguraci SqlDataSource (klikněte na Další a pak 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í metody SqlDataSource s Select()
se hodnota parametru UnitPrice
(25.00) použije na @UnitPrice
parametr v SelectCommand
před odesláním do databáze. Čistý výsledek je, že se z Products
tabulky vrátí pouze produkty menší nebo rovné 25,00 Usd. Pokud to chcete potvrdit, přidejte na stránku Objekt GridView, vytvořte vazbu k tomuto zdroji 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, jak je znázorněno na obrázku 3.
Obrázek 3: Zobrazí se pouze produkty menší než nebo rovno 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, nechte 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, abyste získali tuto prahovou hodnotu od uživatele. 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 GridView na stránku a z jeho inteligentní značky zvolte vytvořit nový SqlDataSource 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 OR @MaximumPrice = -1.0
Po zadání dotazu (ručně nebo prostřednictvím Tvůrce dotazů) klikněte na Další.
Obrázek 4: Vrácení pouze těch produktů, které jsou menší než nebo rovno 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ů. V rozevíracím seznamu Zdroj parametrů zvolte Ovládací prvek 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. Prozatím nezadávejte výchozí hodnotu.
Obrázek 5: Vlastnost MaxPrice
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 Další a potom 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 s <SelectParameters>
je , ControlParameter
který obsahuje další vlastnosti jako 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 odpovídajícímu parametru SelectCommand
v . V tomto příkladu se jako @MaxPrice
hodnota parametru MaxPrice
používá vlastnost s Text.
Chvíli si tuto stránku prohlédněte v prohlížeči. Při první návštěvě stránky nebo pokaždé, když MaxPrice
TextBox nemá hodnotu, se v Zobrazení GridView nezobrazí žá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 se ve výchozím nastavení prázdný řetězec pro hodnotu parametru převede 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 Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
' Get the data from the SqlDataSource as a DataView
Dim randomCategoryView As DataView = CType _
(RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty), DataView)
If randomCategoryView.Count > 0 Then
' Assign the CategoryName value to the Label
CategoryNameLabel.Text = String.Format( _
"Here are Products in the {0} Category...", _
randomCategoryView(0)("CategoryName").ToString())
End If
End Sub
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() Then
Dim categoryName as String = randomCategoryReader("CategoryName').ToString()
...
End If
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 přidáním objektu GridView na stránku a vytvořte vazbu na nový zdroj dat Sql 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 Žá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ů, ovládacího prvku Web jako zdroje parametrů a programového určení hodnoty parametru.
Stejně jako u objektu ObjectDataSource poskytuje i SqlDataSource 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.
Všechno nejlepší na 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 zastihnout na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na adrese http://ScottOnWriting.NET.
Zvláštní poděkování
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty pro tento kurz byli Scott Clyde, Randell Schmidt a Ken Pespisa. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.