Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här självstudien fortsätter vi att titta på SqlDataSource-kontrollen och lär oss hur du definierar parametriserade frågor. Parametrarna kan anges både deklarativt och programmässigt och kan hämtas från ett antal platser, till exempel frågesträngen, sessionstillståndet, andra kontroller med mera.
Inledning
I den föregående självstudien såg vi hur du använder SqlDataSource-kontrollen för att hämta data direkt från en databas. Med hjälp av guiden Konfigurera datakälla kan vi välja databasen och sedan antingen välja de kolumner som ska returneras från en tabell eller vy. ange en anpassad SQL-instruktion. eller använd en lagrad procedur. Oavsett om du väljer kolumner från en tabell eller vy eller anger en anpassad SQL-instruktion tilldelas SqlDataSource-kontrollens egenskap SelectCommand den resulterande ad hoc SQL-satsen SELECT och denna SELECT används när SqlDataSource-s Select() metod anropas (antingen programmässigt eller automatiskt från en datawebbkontroll).
De SQL-satser SELECT som användes i föregående handledningens demos saknade WHERE villkor. I ett SELECT uttryck kan WHERE satsen användas för att begränsa resultaten som returneras. Om du till exempel vill visa namnen på produkter som kostar mer än 50,00 USD kan vi använda följande fråga:
SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00
Vanligtvis bestäms värdena som används i en WHERE sats av någon extern källa, till exempel ett frågesträngsvärde, en sessionsvariabel eller användarindata från en webbkontroll på sidan. Helst anges sådana indata med hjälp av parametrar. Med Microsoft SQL Server betecknas parametrar med , @parameterNamesom i:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource stöder parametriserade frågor, både för SELECT -instruktioner och INSERT, UPDATEoch DELETE -instruktioner. Dessutom kan parametervärdena automatiskt hämtas från en mängd olika källor, frågesträngen, sessionstillståndet, kontrollerna på sidan och så vidare eller kan tilldelas programmatiskt. I den här självstudien får vi se hur du definierar parametriserade frågor samt hur du anger parametervärdena både deklarativt och programmatiskt.
Anmärkning
I den föregående självstudien jämförde vi ObjectDataSource som har varit vårt valfritt verktyg under de första 46 självstudierna med SqlDataSource och noterade deras konceptuella likheter. Dessa likheter omfattar även parametrar. ObjectDataSource-parametrarna mappade till indataparametrarna för metoderna i affärslogiklagret. Med SqlDataSource definieras parametrarna direkt i SQL-frågan. Båda kontrollerna har samlingar med parametrar för metoderna Select(), Insert(), Update()och Delete() och båda kan ha dessa parametervärden ifyllda från fördefinierade källor (frågesträngsvärden, sessionsvariabler och så vidare) eller tilldelas programmatiskt.
Skapa en parameteriserad fråga
Guiden Konfigurera datakälla i SqlDataSource-kontrollen erbjuder tre sätt att definiera kommandot som ska köras för att hämta databasposter:
- Genom att välja kolumnerna från en befintlig tabell eller vy,
- Genom att ange en anpassad SQL-instruktion, eller
- Genom att välja en lagrad procedur
När du väljer kolumner från en befintlig tabell eller vy måste parametrarna WHERE för satsen anges i dialogrutan Lägg till WHERE sats. När du skapar en anpassad SQL-instruktion kan du dock ange parametrarna direkt i WHERE -satsen (med hjälp av @parameterName för att ange varje parameter). En lagrad procedur består av en eller flera SQL-instruktioner och dessa instruktioner kan parametriseras. De parametrar som används i SQL-uttrycken måste dock skickas som indataparametrar till den lagrade proceduren.
Eftersom skapandet av en parametriserad fråga beror på hur SqlDataSource s SelectCommand anges ska vi ta en titt på alla tre metoderna. Kom igång genom att öppna ParameterizedQueries.aspx sidan i SqlDataSource mappen, dra en SqlDataSource-kontroll från verktygslådan till designern och ange den ID till Products25BucksAndUnderDataSource. Klicka sedan på länken Konfigurera datakälla från kontrollens smarta tagg. Välj den databas som ska användas (NORTHWINDConnectionString) och klicka på Nästa.
Steg 1: Lägga till en WHERE-sats när du väljer kolumner från en tabell eller vy
När du väljer de data som ska returneras från databasen med SqlDataSource-kontrollen kan vi i guiden Konfigurera datakälla välja vilka kolumner som ska returneras från en befintlig tabell eller vy (se bild 1). När du gör det skapas automatiskt en SQL-instruktion SELECT , vilket är vad som skickas till databasen när metoden SqlDataSource anropas Select() . Precis som i föregående självstudie väljer du tabellen Produkter i listrutan och markerar kolumnerna ProductID, ProductNameoch UnitPrice .
Bild 1: Välj de kolumner som ska returneras från en tabell eller vy (Klicka om du vill visa en bild i full storlek)
För att inkludera en klause WHERE i instruktionen SELECT, klicka på knappen WHERE, vilket öppnar dialogrutan Lägg till klause WHERE (se bild 2). Om du vill lägga till en parameter för att begränsa resultatet som returneras av SELECT frågan väljer du först den kolumn som data ska filtreras efter. Välj sedan den operator som ska användas för filtrering (=, <, <=, >och så vidare). Välj slutligen källan till parameterns värde, till exempel från frågesträngen eller sessionstillståndet. När du har konfigurerat parametern klickar du på knappen Lägg till för att inkludera den SELECT i frågan.
I det här exemplet ska vi bara returnera de resultat där UnitPrice värdet är mindre än eller lika med 25,00 USD. Välj UnitPrice därför i listrutan Kolumn och <= i listrutan Operator. När du använder ett hårdkodat parametervärde (till exempel 25,00 USD) eller om parametervärdet ska anges programmatiskt väljer du Ingen i listrutan Källa. Ange sedan det hårdkodade parametervärdet i textrutan Värde 25.00 och slutför processen genom att klicka på knappen Lägg till.
Bild 2: Begränsa de resultat som returneras från dialogrutan Lägg till WHERE sats (Klicka om du vill visa en bild i full storlek)
När du har lagt till parametern klickar du på OK för att återgå till guiden Konfigurera datakälla. Instruktionen SELECT längst ned i guiden bör nu innehålla en WHERE sats med en parameter med namnet @UnitPrice:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Anmärkning
Om du anger flera villkor i satsen i WHERE dialogrutan Lägg till WHERE sats ansluter guiden dem till operatorn AND . Om du behöver inkludera en OR i WHERE -satsen (till exempel WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) måste du skapa -instruktionen SELECT via den anpassade SQL-instruktionsskärmen.
Slutför konfigurationen av SqlDataSource (klicka på Nästa och sedan på Slutför) och inspektera sedan SqlDataSources deklarativa markering. Markeringen innehåller nu en <SelectParameters> samling, som förklarar källorna för parametrarna i 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>
När SqlDataSource-metoden anropas Select()UnitPrice tillämpas parametervärdet (25.00) på parametern @UnitPrice i SelectCommand innan den skickas till databasen. Nettoresultatet är att endast de produkter som är mindre än eller lika med 25,00 USD returneras från Products tabellen. Bekräfta detta genom att lägga till en GridView på sidan, binda den till den här datakällan och sedan visa sidan via en webbläsare. Du bör bara se de produkter som visas som är mindre än eller lika med 25,00 USD, vilket visas i bild 3.
Bild 3: Endast de produkter som är mindre än eller lika med 25,00 USD visas (klicka om du vill visa en bild i full storlek)
Steg 2: Lägga till parametrar i en anpassad SQL-instruktion
När du lägger till en anpassad SQL-instruktion kan du ange WHERE satsen explicit eller ange ett värde i filtercellen i Query Builder. För att visa detta ska vi visa bara de produkter i en GridView vars priser är mindre än ett visst tröskelvärde. Börja med att lägga till en textruta på ParameterizedQueries.aspx sidan för att samla in det här tröskelvärdet från användaren. Ställ in TextBoxs ID-egenskap till MaxPrice. Lägg till en knappwebbkontroll och ange dess Text egenskap till Visa matchande produkter .
Dra sedan en GridView till sidan och från den smarta taggen väljer du att skapa en ny SqlDataSource med namnet ProductsFilteredByPriceDataSource. I guiden Konfigurera datakälla fortsätter du till skärmen Ange en anpassad SQL-instruktion eller lagrad procedur (se bild 4) och anger följande fråga:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
När du har angett frågan (antingen manuellt eller via Frågeverktyget) klickar du på Nästa.
Bild 4: Returnera endast de produkter som är mindre än eller lika med ett parametervärde (klicka om du vill visa en bild i full storlek)
Eftersom frågan innehåller parametrar frågar nästa skärm i guiden oss om källan till parametrarnas värden. Välj Kontroll i listrutan Parameterkälla och MaxPrice (textbox-kontrollens ID värde) i listrutan ControlID. Du kan också ange ett valfritt standardvärde som ska användas om användaren inte har angett någon text i textrutan MaxPrice . Ange inte ett standardvärde för tillfället.
Bild 5: Egenskapen MaxPrice Textbox används Text som parameterkälla (klicka om du vill visa en bild i full storlek)
Slutför guiden Konfigurera datakälla genom att klicka på Nästa och sedan på Slutför. Deklarativ kod för GridView, TextBox, Button och SqlDataSource följer:
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>
Observera att parametern i avsnittet SqlDataSource s <SelectParameters> är en ControlParameter, som innehåller ytterligare egenskaper som ControlID och PropertyName. När SqlDataSource-metoden anropas Select()ControlParameter hämtar den värdet från den angivna webbkontrollegenskapen och tilldelar det till motsvarande parameter i SelectCommand. I det här exemplet MaxPrice används egenskapen s Text som @MaxPrice parametervärde.
Ta en minut att visa den här sidan via en webbläsare. Vid det första besöket på sidan eller när MaxPrice textrutan saknar ett värde visas inga poster i GridViewen.
Bild 6: Inga poster visas när MaxPrice textrutan är tom (Klicka om du vill visa en bild i full storlek)
Anledningen till att inga produkter visas är att som standard konverteras en tom sträng för ett parametervärde till ett databasvärde NULL . Eftersom jämförelsen av [UnitPrice] <= NULL alltid utvärderas som False returneras inga resultat.
Ange ett värde i textrutan, till exempel 5.00, och klicka på knappen Visa matchande produkter. Vid postback informerar SqlDataSource GridView om att en av dess parameterkällor har ändrats. Därför binds GridView om till SqlDataSource och visar dessa produkter som är mindre än eller lika med 5,00 USD.
Bild 7: Produkter som är mindre än eller lika med 5,00 USD visas (Klicka om du vill visa en bild i full storlek)
Visa först alla produkter
I stället för att inte visa några produkter när sidan läses in först kanske vi vill visa alla produkter. Ett sätt att lista alla produkter när MaxPrice textrutan är tom är att ange parameterns standardvärde till något vansinnigt högt värde, till exempel 10000000, eftersom det är osannolikt att Northwind Traders någonsin kommer att ha lager vars enhetspris överstiger $ 1,000,000. Den här metoden är dock kortsynt och kanske inte fungerar i andra situationer.
I tidigare handledningar – Deklarativa parametrar och huvud/detaljfiltrering med en listruta stod vi inför ett liknande problem. Vår lösning där var att placera den här logiken i affärslogiklagret. Mer specifikt undersökte BLL det inkommande värdet och om det var NULL eller något reserverat värde dirigerades anropet till DAL-metoden som returnerade alla poster. Om det inkommande värdet var ett normalt filtreringsvärde gjordes ett anrop till DAL-metoden som körde en SQL-instruktion som använde en parametriserad sats WHERE med det angivna värdet.
Tyvärr kringgår vi arkitekturen när du använder SqlDataSource. I stället måste vi anpassa SQL-instruktionen för att på ett intelligent sätt hämta alla poster om parametern @MaximumPrice är NULL eller något reserverat värde. I den här övningen ska vi ha den så att om parametern @MaximumPrice är lika -1.0med ska alla poster returneras (-1.0 fungerar som ett reserverat värde eftersom ingen produkt kan ha ett negativt UnitPrice värde). För att göra detta kan vi använda följande SQL-instruktion:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
Denna WHERE klausul returnerar alla poster om @MaximumPrice-parametern är lika med -1.0. Om parametervärdet inte -1.0är returneras endast de produkter vars UnitPrice värde är mindre än eller lika med @MaximumPrice parametervärdet. Genom att ange standardvärdet för parametern @MaximumPrice till -1.0, vid den första sidinläsningen MaxPrice (eller när textrutan är tom), @MaximumPrice kommer att ha värdet -1.0 och alla produkter visas.
Bild 8: Nu visas alla produkter när MaxPrice textrutan är tom (klicka om du vill visa en bild i full storlek)
Det finns ett par varningar att notera med den här metoden. Börja med att inse att parameterns datatyp härleds av dess användning i SQL-frågan. Om du ändrar WHERE -satsen från @MaximumPrice = -1.0 till @MaximumPrice = -1behandlar körningen parametern som ett heltal. Om du sedan försöker tilldela MaxPrice textrutan till ett decimalvärde (till exempel 5,00 ) uppstår ett fel eftersom det inte kan konvertera 5,00 till ett heltal. Du kan åtgärda detta genom att antingen se till att du använder @MaximumPrice = -1.0 i WHERE -satsen eller, ännu bättre, ange ControlParameter objektets Type egenskap till Decimal .
För det andra, genom att lägga till i OR @MaximumPrice = -1.0WHERE -satsen, kan frågemotorn inte använda ett index på UnitPrice (förutsatt att ett finns), vilket resulterar i en tabellgenomsökning. Detta kan påverka prestanda om det finns tillräckligt många poster i Products tabellen. En bättre metod är att flytta den här logiken till en lagrad procedur där en IF -instruktion antingen skulle utföra en SELECT fråga från Products tabellen utan en WHERE -sats när alla poster måste returneras eller en vars sats WHERE bara UnitPrice innehåller kriterierna, så att ett index kan användas.
Steg 3: Skapa och använda parameteriserade lagrade procedurer
Lagrade procedurer kan innehålla en uppsättning indataparametrar som sedan kan användas i DE SQL-instruktioner som definieras i den lagrade proceduren. När du konfigurerar SqlDataSource att använda en lagrad procedur som accepterar indataparametrar kan dessa parametervärden anges med samma tekniker som med ad hoc SQL-instruktioner.
För att illustrera hur du använder lagrade procedurer i SqlDataSource skapar vi en ny lagrad procedur i Northwind-databasen med namnet GetProductsByCategory, som accepterar en parameter med namnet @CategoryID och returnerar alla kolumner i de produkter vars CategoryID kolumn matchar @CategoryID. Om du vill skapa en lagrad procedur går du till Serverutforskaren och ökar detaljnivån i NORTHWND.MDF databasen. (Om du inte ser ServerUtforskaren tar du upp den genom att gå till menyn Visa och välja alternativet Serverutforskaren.)
NORTHWND.MDF Högerklicka på mappen Lagrade procedurer i databasen, välj Lägg till ny lagrad procedur och ange följande syntax:
CREATE PROCEDURE dbo.GetProductsByCategory
(
@CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID
Klicka på ikonen Spara (eller Ctrl+S) för att spara den lagrade proceduren. Du kan testa den lagrade proceduren genom att högerklicka på den från mappen Lagrade procedurer och välja Kör. Då uppmanas du att ange parametrarna för den lagrade proceduren (@CategoryIDi den här instansen), varefter resultatet visas i fönstret Utdata.
Bild 9: Den GetProductsByCategory lagrade proceduren när den exekveras med en @CategoryID av 1 (Klicka för att visa bilden i full storlek)
Vi använder den här lagrade proceduren för att visa alla produkter i kategorin Drycker i en GridView. Lägg till en ny GridView på sidan och binda den till en ny SqlDataSource med namnet BeverageProductsDataSource. Fortsätt till skärmen Ange en anpassad SQL-instruktion eller lagrad procedur, välj alternativknappen Lagrad procedur och välj den GetProductsByCategory lagrade proceduren i listrutan.
Bild 10: Välj den GetProductsByCategory lagrade proceduren i listan Drop-Down (Klicka om du vill visa en bild i full storlek)
Eftersom den lagrade proceduren accepterar en indataparameter (@CategoryID) uppmanas vi att ange källan för parameterns värde genom att klicka på Nästa. Drycker CategoryID är 1, så lämna listrutan för parameterns källa på Ingen och ange 1 i textrutan DefaultValue.
Bild 11: Använd ett Hard-Coded värde på 1 för att returnera produkterna i kategorin Drycker (Klicka om du vill visa en bild i full storlek)
Som följande deklarativa markering visar, när du använder en lagrad procedur, anges egenskapen SqlDataSources SelectCommand till namnet på den lagrade proceduren och SelectCommandType egenskapen är inställd StoredProcedurepå , vilket anger att SelectCommand är namnet på en lagrad procedur i stället för en ad hoc SQL-instruktion.
<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>
Testa sidan i en webbläsare. Endast de produkter som tillhör kategorin Drycker visas, även om alla produktfält visas eftersom den GetProductsByCategory lagrade proceduren returnerar alla kolumner från Products tabellen. Vi kan naturligtvis begränsa eller anpassa fälten som visas i GridView från dialogrutan Redigera kolumner i GridView.
Bild 12: Alla drycker visas (Klicka om du vill visa en bild i full storlek)
Steg 4: Programmatiskt anropa en SqlDataSource-instruktion för Select()
Exemplen vi har sett i de tidigare handledningarna och i denna handledning har hittills bundit SqlDataSource-kontroller direkt till en GridView. SqlDataSource-kontrollens data kan dock användas programmatiskt och räknas upp i kod. Detta kan vara särskilt användbart när du behöver fråga data för att inspektera dem, men inte behöver visa den. I stället för att behöva skriva all boilerplate-ADO.NET kod för att ansluta till databasen, ange kommandot och hämta resultaten kan du låta SqlDataSource hantera den här monotona koden.
För att illustrera hur du arbetar med SqlDataSources data programmatiskt kan du tänka dig att din chef har kontaktat dig med en begäran om att skapa en webbsida som visar namnet på en slumpmässigt vald kategori och dess associerade produkter. När en användare besöker den här sidan vill vi alltså slumpmässigt välja en kategori i Categories tabellen, visa kategorinamnet och sedan visa en lista över de produkter som tillhör den kategorin.
För att åstadkomma detta behöver vi två SqlDataSource-kontroller en för att hämta en slumpmässig kategori från Categories tabellen och en annan för att hämta kategorins produkter. Vi skapar den SqlDataSource som hämtar en slumpmässig kategoripost i det här steget. Steg 5 handlar om att skapa den SqlDataSource som hämtar kategorins produkter.
Börja med att lägga till en SqlDataSource i ParameterizedQueries.aspx och ange dess ID till RandomCategoryDataSource. Konfigurera den så att den använder följande SQL-fråga:
SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()
ORDER BY NEWID() returnerar posterna sorterade i slumpmässig ordning (se Använda NEWID() för att sortera poster slumpmässigt).
SELECT TOP 1 returnerar den första posten från resultatuppsättningen. Tillsammans returnerar den här frågan kolumnvärdena CategoryID och CategoryName från en enda, slumpmässigt vald kategori.
Om du vill visa kategorins CategoryName värde lägger du till en etikettwebbkontroll på sidan, anger dess ID egenskap till CategoryNameLabeloch avmarkerar dess Text egenskap. För att programmatiskt hämta data från en SqlDataSource-kontroll måste vi anropa dess Select() metod.
MetodenSelect() förväntar sig en enskild indataparameter av typen DataSourceSelectArguments, som anger hur data ska skickas innan de returneras. Detta kan inkludera instruktioner för sortering och filtrering av data och används av webbkontrollerna för data vid sortering eller paginering genom data från en SqlDataSource-kontroll. I vårt exempel behöver vi dock inte att data ändras innan de returneras och skickar därför objektet DataSourceSelectArguments.Empty .
Metoden Select() returnerar ett objekt som implementerar IEnumerable. Den exakta typ som returneras beror på värdet för sqlDataSource-kontrollens DataSourceMode egenskap. Som beskrivs i föregående självstudie kan den här egenskapen anges till värdet antingen DataSet eller DataReader. Om värdet är DataSetreturnerar Select() metoden ett DataView-objekt . Om värdet är inställt DataReaderpå returneras ett objekt som implementerar IDataReader.
RandomCategoryDataSource Eftersom SqlDataSource har sin DataSourceMode egenskap inställd DataSet på (standard) kommer vi att arbeta med ett DataView-objekt.
Följande kod visar hur du hämtar posterna från RandomCategoryDataSource SqlDataSource som en DataView samt hur du läser CategoryName kolumnvärdet från den första DataView-raden:
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] returnerar den första DataRowView i DataView.
randomCategoryView[0]["CategoryName"] returnerar värdet för kolumnen på den CategoryName första raden. Observera att DataView är löst skrivet. För att referera till ett visst kolumnvärde måste vi skicka in namnet på kolumnen som en sträng ( CategoryName, i det här fallet). Bild 13 visar meddelandet som visas i CategoryNameLabel när du visar sidan. Naturligtvis väljs det faktiska kategorinamnet slumpmässigt av RandomCategoryDataSource SqlDataSource vid varje besök på sidan (inklusive postbacks).
Bild 13: Det slumpmässigt valda kategorinamnet visas (Klicka om du vill visa en bild i full storlek)
Anmärkning
Om SqlDataSource-kontrollens egenskap hade angetts till DataSourceModeDataReader, skulle returvärdet från metoden Select() ha behövt omvandlas till IDataReader. Om du vill läsa CategoryName kolumnvärdet från den första raden använder vi kod som:
if (randomCategoryReader.Read())
{
string categoryName = randomCategoryReader["CategoryName"].ToString();
...
}
När SqlDataSource slumpmässigt väljer en kategori är vi redo att lägga till GridView som visar kategorins produkter.
Anmärkning
I stället för att använda en etikettwebbkontroll för att visa kategorins namn, kunde vi ha lagt till en FormView eller DetailsView på sidan och binda den till SqlDataSource. Med hjälp av etiketten kunde vi dock utforska hur vi programmatiskt anropar SqlDataSource-instruktionen Select() och arbetar med dess resulterande data i kod.
Steg 5: Tilldela parametervärden programmatiskt
Alla exempel som vi har sett hittills i den här självstudien har använt antingen ett hårdkodat parametervärde eller ett som hämtats från någon av de fördefinierade parameterkällorna (ett frågesträngsvärde, en webbkontroll på sidan och så vidare). SqlDataSource-kontrollens parametrar kan dock också anges programmatiskt. För att slutföra vårt aktuella exempel behöver vi en SqlDataSource som returnerar alla produkter som tillhör en angiven kategori. Den här SqlDataSource har en CategoryID parameter vars värde måste anges baserat på kolumnvärdet CategoryID som returneras av RandomCategoryDataSource SqlDataSource i Page_Load händelsehanteraren.
Börja med att lägga till en GridView på sidan och binda den till en ny SqlDataSource med namnet ProductsByCategoryDataSource. Precis som vi gjorde i steg 3 konfigurerar du SqlDataSource så att den anropar den GetProductsByCategory lagrade proceduren. Låt listrutan Parameterkälla vara inställd på Ingen, men ange inte ett standardvärde, eftersom vi ställer in det här standardvärdet programmatiskt.
Bild 14: Ange inte en parameterkälla eller standardvärde (klicka om du vill visa en bild i full storlek)
När du har slutfört SqlDataSource-guiden bör den resulterande deklarativa markeringen se ut ungefär så här:
<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
Vi kan tilldela parametern DefaultValue för CategoryID programmatiskt i Page_Load-händelsehanteraren.
// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
randomCategoryView[0]["CategoryID"].ToString();
Med det här tillägget innehåller sidan en GridView som visar de produkter som är associerade med den slumpmässigt valda kategorin.
Bild 15: Ange inte en parameterkälla eller standardvärde (Klicka om du vill visa en bild i full storlek)
Sammanfattning
Med SqlDataSource kan sidutvecklare definiera parametriserade frågor vars parametervärden kan hårdkodas, hämtas från fördefinierade parameterkällor eller tilldelas programmatiskt. I den här självstudien såg vi hur du skapar en parametriserad fråga från guiden Konfigurera datakälla för både ad hoc-SQL-frågor och lagrade procedurer. Vi tittade också på att använda hårdkodade parameterkällor, en webbkontroll som en parameterkälla och programmatiskt ange parametervärdet.
Precis som med ObjectDataSource tillhandahåller SqlDataSource även funktioner för att ändra dess underliggande data. I nästa självstudie tittar vi på hur du definierar INSERT, UPDATEoch DELETE -instruktioner med SqlDataSource. När de här instruktionerna har lagts till kan vi använda de inbyggda funktionerna infoga, redigera och ta bort de funktioner som ingår i kontrollerna GridView, DetailsView och FormView.
Lycka till med programmerandet!
Om författaren
Scott Mitchell, författare till sju ASP/ASP.NET-böcker och grundare av 4GuysFromRolla.com, har arbetat med Microsofts webbtekniker sedan 1998. Scott arbetar som oberoende konsult, tränare och författare. Hans senaste bok är Sams Teach Yourself ASP.NET 2.0 på 24 timmar. Han kan nås på mitchell@4GuysFromRolla.com.
Särskilt tack till
Den här självstudieserien granskades av många användbara granskare. Huvudgranskare för den här självstudien var Scott Clyde, Randell Schmidt och Ken Pespisa. Vill du granska mina kommande MSDN-artiklar? Om så är fallet, hör av dig på mitchell@4GuysFromRolla.com.
@CategoryID of 1" />