Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
door Scott Mitchell
In deze zelfstudie gaan we verder met het besturingselement SqlDataSource en leren we hoe u geparameteriseerde query's definieert. De parameters kunnen zowel declaratief als programmatisch worden opgegeven en kunnen worden opgehaald van een aantal locaties, zoals de queryreeks, sessiestatus, andere besturingselementen en meer.
Introductie
In de vorige zelfstudie hebben we gezien hoe u het besturingselement SqlDataSource gebruikt om gegevens rechtstreeks uit een database op te halen. Met behulp van de wizard Gegevensbron configureren kunnen we de database kiezen en vervolgens de kolommen kiezen die moeten worden geretourneerd uit een tabel of weergave; voer een aangepaste SQL-instructie in; of gebruik een opgeslagen procedure. Of u nu kolommen in een tabel of weergave selecteert of een aangepaste SQL-instructie invoert, de eigenschap sqlDataSource-besturingselement SelectCommand wordt de resulterende ad-hoc SQL-instructie SELECT toegewezen en dit is deze SELECT instructie die wordt uitgevoerd wanneer de methode SqlDataSource Select() wordt aangeroepen (programmatisch of automatisch vanuit een gegevenswebbesturingselement).
De SQL-instructies SELECT die in de demo's van de vorige les zijn gebruikt, hadden geen clausules.WHERE In een SELECT instructie kan de WHERE clausule worden gebruikt om de geretourneerde resultaten te beperken. Als u bijvoorbeeld de namen van producten wilt weergeven die meer dan $ 50,00 kosten, kunnen we de volgende query gebruiken:
SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00
Normaal gesproken worden de waarden die in een WHERE component worden gebruikt, bepaald door een externe bron, zoals een querytekenreekswaarde, een sessievariabele of gebruikersinvoer van een webbesturing op de pagina. In het ideale voorbeeld worden dergelijke invoerwaarden opgegeven via het gebruik van parameters. Met Microsoft SQL Server worden parameters aangeduid met behulp van @parameterName, zoals in:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource ondersteunt geparameteriseerde query's, zowel voor SELECT instructies als INSERT, UPDATEen DELETE instructies. Bovendien kunnen de parameterwaarden automatisch worden opgehaald uit verschillende bronnen, zoals de queryreeks, sessiestatus, besturingselementen op de pagina, enzovoort, of programmatisch kunnen worden toegewezen. In deze zelfstudie leert u hoe u geparameteriseerde query's definieert en hoe u de parameterwaarden zowel declaratief als programmatisch opgeeft.
Opmerking
In de vorige zelfstudie hebben we de ObjectDataSource vergeleken die ons hulpprogramma naar keuze is geweest in de eerste 46 zelfstudies met sqlDataSource, waarbij hun conceptuele overeenkomsten worden gezien. Deze overeenkomsten zijn ook van toepassing op parameters. De parameters van ObjectDataSource die overeenkomen met de invoerparameters voor de methoden in de businesslogicalaag. Met sqlDataSource worden de parameters rechtstreeks in de SQL-query gedefinieerd. Beide besturingselementen hebben verzamelingen parameters voor hun Select(), Insert(), Update() en Delete() methoden, en beide kunnen deze parameterwaarden vullen vanuit vooraf gedefinieerde bronnen (queryreekswaarden, sessievariabelen, enzovoort) of programmatisch worden toegewezen.
Een geparameteriseerde query maken
De wizard 'Gegevensbron configureren' van het SqlDataSource-besturingselement biedt drie mogelijkheden voor het definiëren van de opdracht die moet worden uitgevoerd om databaserecords op te halen.
- Door de kolommen uit een bestaande tabel of weergave te kiezen,
- Door een aangepaste SQL-instructie in te voeren, of
- Door een opgeslagen procedure te kiezen
Wanneer u kolommen uit een bestaande tabel of weergave kiest, moeten de parameters voor de WHERE component worden opgegeven via het dialoogvenster Component toevoegen WHERE . Wanneer u echter een aangepaste SQL-instructie maakt, kunt u de parameters rechtstreeks in de WHERE clausule invoeren (met behulp van @parameterName om elke parameter aan te geven). Een opgeslagen procedure bestaat uit een of meer SQL-instructies en deze instructies kunnen worden geparameteriseerd. De parameters die in de SQL-instructies worden gebruikt, moeten echter worden doorgegeven als invoerparameters aan de opgeslagen procedure.
Aangezien het maken van een geparameteriseerde query afhankelijk is van hoe de SqlDataSource s SelectCommand is opgegeven, gaan we alle drie de benaderingen bekijken. Als u aan de slag wilt gaan, opent u de ParameterizedQueries.aspx pagina in de SqlDataSource map, sleept u een SqlDataSource-besturingselement van de Werkbalk naar de Ontwerper en stelt u ID deze in op Products25BucksAndUnderDataSource. Klik vervolgens op de koppeling Gegevensbron configureren vanuit het slimme label van het besturingselement. Selecteer de database die u wilt gebruiken (NORTHWINDConnectionString) en klik op Volgende.
Stap 1: Een WHERE-component toevoegen bij het kiezen van de kolommen uit een tabel of weergave
Wanneer u de gegevens selecteert die moeten worden geretourneerd uit de database met het besturingselement SqlDataSource, kunnen we met de wizard Gegevensbron configureren de kolommen kiezen die moeten worden geretourneerd uit een bestaande tabel of weergave (zie afbeelding 1). Als u dit doet, wordt automatisch een SQL-instructie SELECT opgebouwd. Dit is wat naar de database wordt verzonden wanneer de methode SqlDataSource Select() wordt aangeroepen. Zoals we in de vorige zelfstudie hebben gedaan, selecteert u de tabel Producten in de vervolgkeuzelijst en controleert u de ProductID, ProductNameen UnitPrice kolommen.
Afbeelding 1: Kies de kolommen die u wilt retourneren uit een tabel of weergave (klik om de afbeelding op volledige grootte weer te geven)
Als u een WHERE component in de SELECT instructie wilt opnemen, klikt u op de WHERE knop, waarin het dialoogvenster Component toevoegen WHERE wordt weergegeven (zie afbeelding 2). Als u een parameter wilt toevoegen om de resultaten te beperken die door de SELECT query worden geretourneerd, kiest u eerst de kolom waarop u de gegevens wilt filteren. Kies vervolgens de operator die moet worden gebruikt voor filteren (=, <= <, >enzovoort). Kies ten slotte de bron van de parameterwaarde, zoals uit de queryreeks of sessiestatus. Nadat u de parameter hebt geconfigureerd, klikt u op de knop Toevoegen om deze op te nemen in de SELECT query.
In dit voorbeeld retourneren we alleen de resultaten waarbij de UnitPrice waarde kleiner is dan of gelijk is aan $ 25,00. Daarom, kies UnitPrice in de vervolgkeuzelijst Kolom en <= in de vervolgkeuzelijst Operator. Wanneer u een in code vastgelegde parameterwaarde (zoals $25,00) gebruikt of als de parameterwaarde programmatisch moet worden opgegeven, selecteert u Geen in de vervolgkeuzelijst Bron. Voer vervolgens de in code vastgelegde parameterwaarde in het tekstvak Waarde 25.00 in en voltooi het proces door op de knop Toevoegen te klikken.
Afbeelding 2: Beperk de resultaten die zijn geretourneerd vanuit het dialoogvenster Component toevoegen WHERE (klik om de afbeelding op volledige grootte weer te geven)
Nadat u de parameter hebt toegevoegd, klikt u op OK om terug te keren naar de wizard Gegevensbron configureren. De SELECT instructie onder aan de wizard moet nu een WHERE component bevatten met een parameter met de naam @UnitPrice:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Opmerking
Als u meerdere voorwaarden opgeeft in de WHERE component in het dialoogvenster Component toevoegen WHERE , voegt de wizard deze samen met de AND operator. Als u een OR in de WHERE clausule (zoals WHERE UnitPrice <= @UnitPrice OR Discontinued = 1) moet opnemen, moet u de SELECT instructie bouwen via het scherm voor aangepaste SQL-instructies.
Voltooi de configuratie van sqlDataSource (klik op Volgende, vervolgens Voltooien) en inspecteer de declaratieve markeringen van SqlDataSource. De opmaak bevat nu een <SelectParameters> verzameling, die de bronnen voor de parameters in de SelectCommand uitlegt.
<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>
Wanneer de methode SqlDataSource Select() wordt aangeroepen, wordt de UnitPrice parameterwaarde (25.00) toegepast op de parameter in de @UnitPriceSelectCommand voordat deze naar de database wordt verzonden. Het nettoresultaat is dat alleen die producten kleiner dan of gelijk aan $ 25,00 worden geretourneerd uit de Products tabel. Als u dit wilt bevestigen, voegt u een GridView toe aan de pagina, verbindt u deze aan deze gegevensbron en bekijkt u de pagina vervolgens via een browser. U zou alleen de producten moeten zien die worden vermeld die minder dan of gelijk aan $ 25,00 zijn, zoals bevestigd door afbeelding 3.
Afbeelding 3: Alleen die producten kleiner dan of gelijk aan $ 25,00 worden weergegeven (klik om de volledige afbeelding weer te geven)
Stap 2: Parameters toevoegen aan een aangepaste SQL-instructie
Wanneer u een aangepaste SQL-instructie toevoegt, kunt u de WHERE component expliciet invoeren of een waarde opgeven in de filtercel van de opbouwfunctie voor query's. Om dit te demonstreren, laten we alleen die producten weergeven in een GridView waarvan de prijzen kleiner zijn dan een bepaalde drempelwaarde. Voeg eerst een tekstvak toe aan de ParameterizedQueries.aspx pagina om deze drempelwaarde van de gebruiker te verzamelen. Stel de eigenschap van het tekstvak in op ID. Voeg een knopwebbesturingselement toe en stel de eigenschap ervan Text in op Overeenkomende producten weergeven.
Sleep vervolgens een GridView naar de pagina en gebruik de slimme tag om een nieuwe SqlDataSource te maken genaamd ProductsFilteredByPriceDataSource. Ga in de wizard Gegevensbron configureren naar het scherm Een aangepaste SQL-instructie of opgeslagen procedure opgeven (zie afbeelding 4) en voer de volgende query in:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
Nadat u de query hebt ingevoerd (handmatig of via de opbouwfunctie voor query's), klikt u op Volgende.
Afbeelding 4: Alleen die producten retourneren die kleiner zijn dan of gelijk zijn aan een parameterwaarde (klik hier om de volledige afbeelding weer te geven)
Omdat de query parameters bevat, vraagt het volgende scherm in de wizard ons om de bron van de parameterwaarden. Kies 'Control' in de vervolgkeuzelijst Parameterbron en MaxPrice (de waarde van het tekstvakbesturingselement ID) in de vervolgkeuzelijst ControlID. U kunt ook een optionele standaardwaarde invoeren die moet worden gebruikt in het geval dat de gebruiker geen tekst heeft ingevoerd in het MaxPrice tekstvak. Voer voorlopig geen standaardwaarde in.
Afbeelding 5: De MaxPrice eigenschap Tekstvak wordt Text gebruikt als de parameterbron (klik om de afbeelding op volledige grootte weer te geven)
Voltooi de wizard Gegevensbron configureren door op Volgende en vervolgens Op Voltooien te klikken. De declaratieve markeringen voor gridview, tekstvak, knop en SqlDataSource volgen:
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>
Houd er rekening mee dat de parameter in de SqlDataSource-sectie <SelectParameters> een ControlParameter is, die aanvullende eigenschappen heeft, zoals ControlID en PropertyName. Wanneer de methode SqlDataSource Select() wordt aangeroepen, wordt de ControlParameter waarde opgehaald uit de opgegeven webbesturingselementeigenschap en toegewezen aan de bijbehorende parameter in de SelectCommand. In dit voorbeeld wordt de MaxPrice eigenschap s Text gebruikt als parameterwaarde @MaxPrice .
Neem even de tijd om deze pagina via een browser weer te geven. Wanneer u de pagina voor het eerst bezoekt of wanneer het MaxPrice tekstvak een waarde mist, worden er geen records weergegeven in de GridView.
Afbeelding 6: Er worden geen records weergegeven wanneer het MaxPrice tekstvak leeg is (klik om de afbeelding op volledige grootte weer te geven)
De reden waarom er geen producten worden weergegeven, is omdat standaard een lege tekenreeks voor een parameterwaarde wordt geconverteerd naar een databasewaarde NULL . Omdat de vergelijking [UnitPrice] <= NULL altijd onwaar is, worden er geen resultaten geretourneerd.
Voer een waarde in het tekstvak in, zoals 5.00, en klik op de knop Overeenkomende producten weergeven. Bij een postback informeert de SqlDataSource de GridView dat een van de parameterbronnen is gewijzigd. Daarom wordt de GridView opnieuw gekoppeld aan de SqlDataSource, waardoor alleen producten worden weergegeven met een prijs van maximaal $5,00.
Afbeelding 7: Producten kleiner dan of gelijk aan $ 5,00 worden weergegeven (klik om de volledige afbeelding weer te geven)
In eerste instantie alle producten weergeven
In plaats van geen producten weer te geven wanneer de pagina voor het eerst wordt geladen, willen we mogelijk alle producten weergeven. Een manier om alle producten weer te geven wanneer het MaxPrice tekstvak leeg is, is door de standaardwaarde van de parameter in te stellen op een aantal waanzinnige hoge waarde, zoals 1000000, omdat het onwaarschijnlijk is dat Northwind Traders ooit voorraad heeft waarvan de eenheidsprijs hoger is dan $ 1.000.000. Deze benadering is echter kortzichtig en werkt mogelijk niet in andere situaties.
In eerdere handleidingen - declaratieve parameters en master/detailfiltering met een vervolgkeuzelijst stonden we voor een vergelijkbaar probleem. Onze oplossing was om deze logica in de bedrijfslogicalaag te plaatsen. In het bijzonder onderzocht de BLL de binnenkomende waarde en, als deze NULL of een bepaalde gereserveerde waarde was, werd de aanroep gerouteerd naar de DAL-methode die alle records teruggaf. Als de binnenkomende waarde een normale filterwaarde was, is er een aanroep uitgevoerd naar de DAL-methode die een SQL-instructie heeft uitgevoerd die een geparameteriseerde WHERE component met de opgegeven waarde heeft gebruikt.
Helaas omzeilen we de architectuur bij gebruik van sqlDataSource. In plaats daarvan moeten we de SQL-instructie aanpassen om op intelligente wijze alle records op te halen als de @MaximumPrice parameter of een gereserveerde waarde is NULL . Voor deze oefening laten we het zo hebben dat als de @MaximumPrice parameter gelijk is aan -1.0, alle records moeten worden geretourneerd (-1.0werkt als een gereserveerde waarde omdat er geen product een negatieve UnitPrice waarde kan hebben). Hiervoor kunnen we de volgende SQL-instructie gebruiken:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
Deze WHERE clausule retourneert alle records als de @MaximumPrice parameter gelijk is aan -1.0. Als de parameterwaarde niet -1.0is, worden alleen de producten geretourneerd waarvan UnitPrice de waarde kleiner is dan of gelijk is aan de @MaximumPrice parameterwaarde. Als u de standaardwaarde van de @MaximumPrice parameter -1.0instelt op , wordt op de eerste pagina geladen (of wanneer het MaxPrice tekstvak leeg is), @MaximumPrice een waarde van -1.0 opgegeven en worden alle producten weergegeven.
Afbeelding 8: Nu worden alle producten weergegeven wanneer het MaxPrice tekstvak leeg is (klik hier om de volledige afbeelding weer te geven)
Er zijn een aantal opmerkingen bij deze benadering. Realiseer u eerst dat het gegevenstype van de parameter wordt afgeleid door het gebruik in de SQL-query. Als u de WHERE component wijzigt van @MaximumPrice = -1.0 in @MaximumPrice = -1, behandelt de runtime de parameter als een geheel getal. Als u het tekstvak vervolgens probeert toe te wijzen MaxPrice aan een decimale waarde (zoals 5,00), treedt er een fout op omdat 5,00 niet kan worden geconverteerd naar een geheel getal. U kunt dit verhelpen door ervoor te zorgen dat u @MaximumPrice = -1.0 in de WHERE clausule gebruikt of, beter nog, stel de ControlParameter eigenschap van het Type object in op Decimaal.
Ten tweede, door de OR @MaximumPrice = -1.0 aan de WHERE clausule toe te voegen, kan de query-engine geen gebruik maken van een index op UnitPrice (ervan uitgaande dat er een bestaat), waardoor er een tabelscan plaatsvindt. Dit kan van invloed zijn op de prestaties als er voldoende veel records in de Products tabel staan. Een betere benadering is om deze logica te verplaatsen naar een opgeslagen procedure waarbij een IF instructie een SELECT query uit de Products tabel zou uitvoeren zonder een WHERE component wanneer alle records moeten worden geretourneerd of één waarvan WHERE de component alleen de UnitPrice criteria bevat, zodat een index kan worden gebruikt.
Stap 3: Geparameteriseerde opgeslagen procedures maken en gebruiken
Opgeslagen procedures kunnen een set invoerparameters bevatten die vervolgens kunnen worden gebruikt in de SQL-instructie(s) die zijn gedefinieerd in de opgeslagen procedure. Bij het configureren van sqlDataSource voor het gebruik van een opgeslagen procedure die invoerparameters accepteert, kunnen deze parameterwaarden worden opgegeven met dezelfde technieken als met ad-hoc SQL-instructies.
Ter illustratie van het gebruik van opgeslagen procedures in SqlDataSource maken we een nieuwe opgeslagen procedure in de Northwind-database met de naam GetProductsByCategory, die een parameter met de naam @CategoryID accepteert en alle kolommen van de producten retourneert waarvan CategoryID de kolom overeenkomt @CategoryID. Als u een opgeslagen procedure wilt maken, gaat u naar Server Explorer en zoomt u in op de NORTHWND.MDF database. (Als u Server Explorer niet ziet, opent u deze door naar het menu Beeld te gaan en de optie Server Explorer te selecteren.)
Klik in de database met de NORTHWND.MDF rechtermuisknop op de map Opgeslagen procedures, kies Nieuwe opgeslagen procedure toevoegen en voer de volgende syntaxis in:
CREATE PROCEDURE dbo.GetProductsByCategory
(
@CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID
Klik op het pictogram Opslaan (of Ctrl+S) om de opgeslagen procedure op te slaan. U kunt de opgeslagen procedure testen door er met de rechtermuisknop op te klikken in de map Opgeslagen procedures en Uitvoeren te kiezen. U wordt gevraagd om de parameters van de opgeslagen procedure (@CategoryIDin dit geval) waarna de resultaten worden weergegeven in het uitvoervenster.
Afbeelding 9: De GetProductsByCategory opgeslagen procedure bij uitvoering met een @CategoryID van 1 (klik om de afbeelding op volledige grootte weer te geven)
Laten we deze opgeslagen procedure gebruiken om alle producten in de categorie Dranken in een GridView weer te geven. Voeg een nieuwe GridView toe aan de pagina en bind deze aan een nieuwe SqlDataSource met de naam BeverageProductsDataSource. Ga door naar het scherm Een aangepaste SQL-instructie of opgeslagen procedure opgeven, selecteer het keuzerondje Opgeslagen procedure en kies de GetProductsByCategory opgeslagen procedure in de vervolgkeuzelijst.
Afbeelding 10: Selecteer de GetProductsByCategory opgeslagen procedure in de Drop-Down lijst (klik om de afbeelding op volledige grootte weer te geven)
Omdat de opgeslagen procedure een invoerparameter accepteert (@CategoryID), worden we na het klikken op 'Volgende' gevraagd om de bron voor deze parameterwaarde op te geven. De dranken CategoryID is 1, dus laat de vervolgkeuzelijst Parametersource op Geen staan en voer 1 in in het tekstvak voor de standaardwaarde.
Afbeelding 11: Gebruik een Hard-Coded waarde van 1 om de producten in de categorie Dranken te retourneren (klik hier om de afbeelding volledig weer te geven)
Zoals in de volgende declaratieve markeringen wordt weergegeven, wordt bij het gebruik van een opgeslagen procedure de eigenschap SqlDataSource SelectCommand ingesteld op de naam van de opgeslagen procedure en wordt de SelectCommandType eigenschap ingesteld StoredProcedureop , waarmee wordt aangegeven dat het SelectCommand de naam is van een opgeslagen procedure in plaats van een ad-hoc SQL-instructie.
<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>
Test de pagina in een browser. Alleen producten die deel uitmaken van de categorie Dranken worden weergegeven, hoewel alle productvelden worden weergegeven omdat de GetProductsByCategory opgeslagen procedure alle kolommen uit de Products tabel retourneert. We kunnen natuurlijk de velden die in de GridView worden weergegeven, beperken of aanpassen vanuit het dialoogvenster Kolommen bewerken van GridView.
Afbeelding 12: Alle dranken worden weergegeven (klik om de afbeelding volledig weer te geven)
Stap 4: Programmatisch een Select()-instructie van SqlDataSource aanroepen
De voorbeelden die we in de vorige zelfstudie hebben gezien en deze zelfstudie hebben tot nu toe sqlDataSource-besturingselementen rechtstreeks gebonden aan een GridView. De gegevens van het sqlDataSource-besturingselement kunnen echter programmatisch worden geopend en geïnventariseerd in code. Dit kan met name handig zijn wanneer u query's moet uitvoeren op gegevens om deze te inspecteren, maar deze niet hoeft weer te geven. In plaats van alle standaardcode ADO.NET code te schrijven om verbinding te maken met de database, de opdracht op te geven en de resultaten op te halen, kunt u de SqlDataSource deze monotonische code laten verwerken.
Ter illustratie van het programmatisch werken met de gegevens van SqlDataSource, stelt u zich voor dat uw baas u heeft benaderd met een aanvraag om een webpagina te maken die de naam van een willekeurig geselecteerde categorie en de bijbehorende producten weergeeft. Wanneer een gebruiker deze pagina bezoekt, willen we willekeurig een categorie in de Categories tabel kiezen, de categorienaam weergeven en vervolgens de producten vermelden die bij die categorie horen.
Hiervoor hebben we twee SqlDataSource-besturingselementen nodig om een willekeurige categorie uit de Categories tabel te halen en een andere om de producten van de categorie op te halen. We bouwen de SqlDataSource die in deze stap een willekeurige categorierecord ophaalt; In stap 5 wordt gekeken naar het maken van de SqlDataSource waarmee de producten van de categorie worden opgehaald.
Begin met het toevoegen van een SqlDataSource aan ParameterizedQueries.aspx en stel deze af ID op RandomCategoryDataSource. Configureer deze zodat deze gebruikmaakt van de volgende SQL-query:
SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()
ORDER BY NEWID() retourneert de records die in willekeurige volgorde zijn gesorteerd (zie Gebruiken NEWID() om records willekeurig te sorteren).
SELECT TOP 1 geeft het eerste gegeven uit de resultatenset terug. Deze query retourneert samen de CategoryID en CategoryName kolomwaarden uit één, willekeurig geselecteerde categorie.
Als u de waarde van de categorie CategoryName wilt weergeven, voegt u een label-webcontrole toe aan de pagina, stelt u de eigenschap ID in op CategoryNameLabel, en wist u de eigenschap Text. Als u de gegevens programmatisch wilt ophalen uit een SqlDataSource-besturingselement, moet u de Select() methode aanroepen. De Select() methode verwacht één invoerparameter van het type DataSourceSelectArguments, die aangeeft hoe de gegevens moeten worden verzonden voordat ze worden geretourneerd. Dit kan instructies bevatten voor het sorteren en filteren van de gegevens en wordt gebruikt door de besturingselementen voor het gegevensweb bij het sorteren of pagiëren van de gegevens uit een SqlDataSource-besturingselement. In ons voorbeeld hoeven de gegevens echter niet te worden gewijzigd voordat ze worden geretourneerd, en daarom geven we het DataSourceSelectArguments.Empty object door.
De Select() methode retourneert een object dat IEnumerable implementeert. Het exacte type dat wordt geretourneerd, is afhankelijk van de waarde van de eigenschap sqlDataSource-besturingselementDataSourceMode. Zoals besproken in de vorige zelfstudie, kan deze eigenschap worden ingesteld op een waarde van DataSet of DataReader. Als deze optie is ingesteld DataSet, retourneert de Select() methode een DataView-object . Als dit is ingesteld DataReader, wordt een object geretourneerd dat wordt geïmplementeerd IDataReader. Omdat de eigenschap van de RandomCategoryDataSource SqlDataSource is ingesteld op DataSourceMode (de standaardinstelling), werken we met een DataView-object.
De volgende code illustreert hoe u de records ophaalt uit sqlDataSource RandomCategoryDataSource als een DataView en hoe u de CategoryName kolomwaarde leest uit de eerste DataView-rij:
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] geeft de eerste DataRowView in de DataView terug.
randomCategoryView[0]["CategoryName"] retourneert de waarde van de CategoryName kolom in deze eerste rij. De DataView is zwak getypt. Als u wilt verwijzen naar een bepaalde kolomwaarde, moet u de naam van de kolom doorgeven als een tekenreeks (CategoryName, in dit geval). Afbeelding 13 toont het bericht dat wordt weergegeven in de CategoryNameLabel wanneer u de pagina bekijkt. De werkelijke categorienaam die wordt weergegeven, wordt natuurlijk willekeurig door de RandomCategoryDataSource SqlDataSource geselecteerd bij elk bezoek aan de pagina (inclusief postbacks).
Afbeelding 13: De naam van de willekeurig geselecteerde categorie wordt weergegeven (klik hier om de volledige afbeelding weer te geven)
Opmerking
Als de eigenschap sqlDataSource-besturingselement DataSourceMode is ingesteld op DataReader, zou de retourwaarde van de Select() methode moeten worden gecast naar IDataReader. Als u de CategoryName kolomwaarde uit de eerste rij wilt lezen, gebruiken we code zoals:
if (randomCategoryReader.Read())
{
string categoryName = randomCategoryReader["CategoryName"].ToString();
...
}
Nu sqlDataSource willekeurig een categorie selecteert, zijn we klaar om de GridView toe te voegen waarin de producten van de categorie worden vermeld.
Opmerking
In plaats van een labelwebbesturingselement te gebruiken om de naam van de categorie weer te geven, kunnen we een FormView of DetailsView aan de pagina hebben toegevoegd, zodat deze aan de SqlDataSource wordt gekoppeld. Met behulp van het label konden we echter verkennen hoe we de sqlDataSource-instructie Select() programmatisch aanroepen en werken met de resulterende gegevens in code.
Stap 5: Parameterwaarden programmatisch toewijzen
Alle voorbeelden die we tot nu toe in deze zelfstudie hebben gezien, hebben een in code vastgelegde parameterwaarde of een waarde gebruikt die afkomstig is van een van de vooraf gedefinieerde parameterbronnen (een querytekenreekswaarde, een webbesturingselement op de pagina, enzovoort). De parameters van het besturingselement SqlDataSource kunnen echter ook programmatisch worden ingesteld. Om ons huidige voorbeeld te voltooien, hebben we een SqlDataSource nodig die alle producten retourneert die behoren tot een opgegeven categorie. Deze SqlDataSource heeft een CategoryID parameter waarvan de waarde moet worden ingesteld op basis van de CategoryID kolomwaarde die wordt geretourneerd door de RandomCategoryDataSource SqlDataSource in de Page_Load gebeurtenis-handler.
Voeg eerst een GridView toe aan de pagina en bind deze aan een nieuwe SqlDataSource met de naam ProductsByCategoryDataSource. Net zoals we in stap 3 hebben gedaan, configureert u de SqlDataSource zodat deze de GetProductsByCategory opgeslagen procedure aanroept. Laat de vervolgkeuzelijst Parameterbron ingesteld op Geen, maar voer geen standaardwaarde in, omdat we deze standaardwaarde programmatisch instellen.
Afbeelding 14: Geef geen parameterbron of standaardwaarde op (klik om de volledige afbeelding weer te geven)
Nadat de wizard SqlDataSource is voltooid, moet de resulterende declaratieve markering er ongeveer als volgt uitzien:
<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
We kunnen in de gebeurtenishandler het DefaultValue van de CategoryID parameter programmeerbaar toewijzen.
// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
randomCategoryView[0]["CategoryID"].ToString();
Met deze toevoeging bevat de pagina een GridView waarin de producten worden weergegeven die zijn gekoppeld aan de willekeurig geselecteerde categorie.
Afbeelding 15: Geef geen parameterbron of standaardwaarde op (klik hier om de volledige afbeelding weer te geven)
Samenvatting
Met SqlDataSource kunnen paginaontwikkelaars geparameteriseerde query's definiëren waarvan de parameterwaarden in code kunnen worden vastgelegd, opgehaald uit vooraf gedefinieerde parameterbronnen of programmatisch kunnen worden toegewezen. In deze zelfstudie hebben we gezien hoe u een geparameteriseerde query kunt maken vanuit de wizard Gegevensbron configureren voor zowel ad-hoc SQL-query's als opgeslagen procedures. We hebben ook gekeken naar het gebruik van in code vastgelegde parameterbronnen, een webbesturingselement als parameterbron en het programmatisch opgeven van de parameterwaarde.
Net als bij ObjectDataSource biedt de SqlDataSource ook mogelijkheden om de onderliggende gegevens te wijzigen. In de volgende zelfstudie gaan we kijken hoe we INSERT, UPDATE, en DELETE instructies met de SqlDataSource definiëren. Zodra deze instructies zijn toegevoegd, kunnen we gebruikmaken van de ingebouwde functies voor invoegen, bewerken en verwijderen die inherent zijn aan de besturingselementen GridView, DetailsView en FormView.
Veel plezier met programmeren!
Over de auteur
Scott Mitchell, auteur van zeven ASP/ASP.NET-boeken en oprichter van 4GuysFromRolla.com, werkt sinds 1998 met Microsoft-webtechnologieën. Scott werkt als onafhankelijk consultant, trainer en schrijver. Zijn laatste boek is Sams Teach Yourself ASP.NET 2.0 in 24 uur. Hij kan worden bereikt op mitchell@4GuysFromRolla.com.
Speciale dank aan
Deze tutorialreeks is beoordeeld door veel behulpzame beoordelers. Hoofdbeoordelaars voor deze tutorial waren Scott Clyde, Randell Schmidt en Ken Pespisa. Bent u geïnteresseerd in het bekijken van mijn aanstaande MSDN-artikelen? Zo ja, laat iets van je horen via mitchell@4GuysFromRolla.com.
@CategoryID van 1" />