Uso di query con parametri con SqlDataSource (C#)
In questa esercitazione si continuerà a esaminare il controllo SqlDataSource e si apprenderà come definire query con parametri. I parametri possono essere specificati sia in modo dichiarativo che a livello di codice e possono essere estratti da diverse posizioni, ad esempio querystring, stato sessione, altri controlli e altro ancora.
Introduzione
Nell'esercitazione precedente è stato illustrato come usare il controllo SqlDataSource per recuperare i dati direttamente da un database. Usando la procedura guidata Configura origine dati, è possibile scegliere il database e quindi scegliere le colonne da restituire da una tabella o da una vista; immettere un'istruzione SQL personalizzata; oppure utilizzare una stored procedure. Se si selezionano colonne da una tabella o da una vista o si immette un'istruzione SQL personalizzata, alla proprietà del SelectCommand
controllo SqlDataSource viene assegnata l'istruzione SQL SELECT
ad hoc risultante ed è questa SELECT
istruzione eseguita quando viene richiamato il metodo sqlDataSource Select()
(a livello di codice o automaticamente da un controllo Web dati).
Le istruzioni SQL SELECT
usate nelle demo dell'esercitazione precedente non dispongono WHERE
di clausole. In un'istruzione SELECT
la WHERE
clausola può essere utilizzata per limitare i risultati restituiti. Ad esempio, per visualizzare i nomi dei prodotti che costano più di $50,00, è possibile usare la query seguente:
SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00
In genere, i valori usati in una WHERE
clausola sono determinati da un'origine esterna, ad esempio un valore di querystring, una variabile di sessione o un input dell'utente da un controllo Web nella pagina. Idealmente, tali input vengono specificati tramite l'uso di parametri. Con Microsoft SQL Server, i parametri vengono indicati usando @parameterName
, come in:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource supporta query con parametri, sia per le istruzioni , INSERT
che per SELECT
le istruzioni , UPDATE
e DELETE
. Inoltre, i valori dei parametri possono essere estratti automaticamente da un'ampia gamma di origini, ovvero la stringa di query, lo stato della sessione, i controlli nella pagina e così via o possono essere assegnati a livello di codice. In questa esercitazione verrà illustrato come definire query con parametri e come specificare i valori dei parametri in modo dichiarativo e programmatico.
Nota
Nell'esercitazione precedente è stato confrontato ObjectDataSource, che è stato lo strumento scelto per le prime 46 esercitazioni con SqlDataSource, notando le analogie concettuali. Queste analogie si estendono anche ai parametri. Parametri di ObjectDataSource mappati ai parametri di input per i metodi nel livello della logica di business. Con SqlDataSource, i parametri vengono definiti direttamente all'interno della query SQL. Entrambi i controlli dispongono di raccolte di parametri per Select()
i relativi metodi , Insert()
, Update()
e Delete()
entrambi possono avere questi valori di parametro popolati da origini predefinite (valori querystring, variabili di sessione e così via) o assegnati a livello di codice.
Creazione di una query con parametri
La procedura guidata Configura origine dati del controllo SqlDataSource offre tre vie per definire il comando da eseguire per recuperare i record del database:
- Selezionando le colonne da una tabella o da una vista esistente,
- Immettendo un'istruzione SQL personalizzata o
- Scegliendo una stored procedure
Quando si selezionano colonne da una tabella o vista esistente, è necessario specificare i parametri per la clausola tramite la WHERE
finestra di dialogo Aggiungi WHERE
clausola . Quando si crea un'istruzione SQL personalizzata, tuttavia, è possibile immettere i parametri direttamente nella WHERE
clausola (usando @parameterName
per indicare ogni parametro). Una stored procedure è costituita da una o più istruzioni SQL e queste istruzioni possono essere parametrizzate. I parametri usati nelle istruzioni SQL, tuttavia, devono essere passati come parametri di input alla stored procedure.
Poiché la creazione di una query con parametri dipende dalla modalità di impostazione di SqlDataSource s SelectCommand
, è possibile esaminare tutti e tre gli approcci. Per iniziare, aprire la ParameterizedQueries.aspx
pagina nella SqlDataSource
cartella, trascinare un controllo SqlDataSource dalla casella degli strumenti nel Designer e impostarne ID
il valore su Products25BucksAndUnderDataSource
. Fare quindi clic sul collegamento Configura origine dati dallo smart tag del controllo. Selezionare il database da usare (NORTHWINDConnectionString
) e fare clic su Avanti.
Passaggio 1: Aggiunta di una clausola WHERE quando si selezionano le colonne da una tabella o da una vista
Quando si selezionano i dati da restituire dal database con il controllo SqlDataSource, la procedura guidata Configura origine dati consente di selezionare semplicemente le colonne da restituire da una tabella o vista esistente (vedere la figura 1). In questo modo viene compilata automaticamente un'istruzione SQLSELECT
, ovvero ciò che viene inviato al database quando viene richiamato il metodo sqlDataSource.Select()
Come illustrato nell'esercitazione precedente, selezionare la tabella Products dall'elenco a discesa e selezionare le ProductID
colonne , ProductName
e UnitPrice
.
Figura 1: Selezionare le colonne da restituire da una tabella o da una vista (fare clic per visualizzare l'immagine a dimensione intera)
Per includere una WHERE
clausola nell'istruzione SELECT
, fare clic sul WHERE
pulsante per visualizzare la finestra di dialogo Aggiungi WHERE
clausola (vedere la figura 2). Per aggiungere un parametro per limitare i risultati restituiti dalla SELECT
query, scegliere prima di tutto la colonna per filtrare i dati. Scegliere quindi l'operatore da usare per filtrare (=, <, <=, >e così via). Infine, scegliere l'origine del valore del parametro, ad esempio dallo stato della stringa di query o della sessione. Dopo aver configurato il parametro, fare clic sul pulsante Aggiungi per includerlo nella SELECT
query.
Per questo esempio, let s restituisce solo i risultati in cui il UnitPrice
valore è minore o uguale a $25,00. Selezionare UnitPrice
quindi dall'elenco a discesa Colonna e <= dall'elenco a discesa Operatore. Quando si usa un valore di parametro hardcoded (ad esempio $ 25,00) o se il valore del parametro deve essere specificato a livello di codice, selezionare Nessuno nell'elenco a discesa Origine. Immettere quindi il valore del parametro hardcoded nella casella di testo Valore 25.00 e completare il processo facendo clic sul pulsante Aggiungi.
Figura 2: Limitare i risultati restituiti dalla finestra di dialogo Aggiungi WHERE
clausola (fare clic per visualizzare l'immagine a dimensione intera)
Dopo aver aggiunto il parametro, fare clic su OK per tornare alla procedura guidata Configura origine dati. L'istruzione SELECT
nella parte inferiore della procedura guidata dovrebbe ora includere una WHERE
clausola con un parametro denominato @UnitPrice
:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Nota
Se si specificano più condizioni nella WHERE
clausola della finestra di dialogo Aggiungi WHERE
clausola, la procedura guidata li unisce all'operatore AND
. Se è necessario includere una OR
nella WHERE
clausola (ad esempio WHERE UnitPrice <= @UnitPrice OR Discontinued = 1
) è necessario compilare l'istruzione SELECT
tramite la schermata dell'istruzione SQL personalizzata.
Completare la configurazione di SqlDataSource (fare clic su Avanti, quindi su Fine) e quindi esaminare il markup dichiarativo di SqlDataSource. Il markup include ora una <SelectParameters>
raccolta, che specifica le origini per i parametri in 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>
Quando viene richiamato il metodo sqlDataSource, Select()
il valore del UnitPrice
parametro (25.00) viene applicato al @UnitPrice
parametro in SelectCommand
prima di essere inviato al database. Il risultato netto è che solo i prodotti minori o uguali a $25,00 vengono restituiti dalla Products
tabella. Per confermarlo, aggiungere un controllo GridView alla pagina, associarlo a questa origine dati e quindi visualizzare la pagina tramite un browser. Dovrebbero essere visualizzati solo i prodotti elencati che sono minori o uguali a $25,00, come conferma la figura 3.
Figura 3: vengono visualizzati solo i prodotti minori o uguali a $25,00 (fare clic per visualizzare l'immagine a dimensione intera)
Passaggio 2: Aggiunta di parametri a un'istruzione SQL personalizzata
Quando si aggiunge un'istruzione SQL personalizzata, è possibile immettere la WHERE
clausola in modo esplicito o specificare un valore nella cella Filter di Generatore query. Per dimostrare questo, è possibile visualizzare solo i prodotti in un controllo GridView i cui prezzi sono inferiori a una determinata soglia. Per iniziare, aggiungere un controllo TextBox alla ParameterizedQueries.aspx
pagina per raccogliere questo valore soglia dall'utente. Impostare la proprietà TextBox s ID
su MaxPrice
. Aggiungere un controllo Web Button e impostarne la Text
proprietà su Visualizza prodotti corrispondenti.
Trascinare quindi gridView nella pagina e dallo smart tag scegliere di creare un nuovo oggetto SqlDataSource denominato ProductsFilteredByPriceDataSource
. Nella procedura guidata Configura origine dati passare alla schermata Specificare un'istruzione SQL personalizzata o una stored procedure (vedere la figura 4) e immettere la query seguente:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
Dopo aver immesso la query (manualmente o tramite Generatore query), fare clic su Avanti.
Figura 4: Restituire solo i prodotti minori o uguali a un valore di parametro (fare clic per visualizzare l'immagine a dimensione intera)
Poiché la query include parametri, la schermata successiva della procedura guidata richiede l'origine dei valori dei parametri. Scegliere Controllo dall'elenco a discesa Origine parametri e MaxPrice
(valore del ID
controllo TextBox) dall'elenco a discesa ControlID. È anche possibile immettere un valore predefinito facoltativo da usare nel caso in cui l'utente non abbia immesso testo in MaxPrice
TextBox. Per il momento, non immettere un valore predefinito.
Figura 5: La MaxPrice
proprietà textBox s Text
viene usata come origine parametro (fare clic per visualizzare l'immagine a dimensione intera)
Completare la procedura guidata Configura origine dati facendo clic su Avanti, quindi su Fine. Il markup dichiarativo per GridView, TextBox, Button e SqlDataSource segue:
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>
Si noti che il parametro all'interno della sezione sqlDataSource è <SelectParameters>
un ControlParameter
oggetto , che include proprietà aggiuntive come ControlID
e PropertyName
. Quando viene richiamato il metodo sqlDataSource, Select()
recupera ControlParameter
il valore dalla proprietà del controllo Web specificata e lo assegna al parametro corrispondente in SelectCommand
. In questo esempio la MaxPrice
proprietà Text viene utilizzata come valore del @MaxPrice
parametro.
Dedicare un minuto alla visualizzazione di questa pagina tramite un browser. Quando si visita per la prima volta la pagina o ogni volta che textBox MaxPrice
non dispone di un valore, non vengono visualizzati record in GridView.
Figura 6: Nessun record viene visualizzato quando la casella di testo è vuota (fare clic per visualizzare l'immagineMaxPrice
a dimensione intera)
Il motivo per cui non viene visualizzato alcun prodotto è perché, per impostazione predefinita, una stringa vuota per un valore di parametro viene convertita in un valore di database NULL
. Poiché il confronto di [UnitPrice] <= NULL
restituisce sempre False, non vengono restituiti risultati.
Immettere un valore nella casella di testo, ad esempio 5.00, e fare clic sul pulsante Visualizza prodotti corrispondenti. Al postback, SqlDataSource informa GridView che una delle origini dei parametri è stata modificata. Di conseguenza, GridView viene riassociato a SqlDataSource, visualizzando tali prodotti minori o uguali a $5,00.
Figura 7: Vengono visualizzati prodotti minori o uguali a $5,00 (fare clic per visualizzare l'immagine a dimensione intera)
Visualizzazione iniziale di tutti i prodotti
Invece di non visualizzare alcun prodotto quando la pagina viene caricata per la prima volta, potrebbe essere necessario visualizzare tutti i prodotti. Un modo per elencare tutti i prodotti ogni volta che TextBox MaxPrice
è vuoto consiste nell'impostare il valore predefinito del parametro su un valore inaneamente elevato, ad esempio 1000000, poiché è improbabile che Northwind Traders abbia mai inventario il cui prezzo unitario supera $1.000.000. Tuttavia, questo approccio è breve e potrebbe non funzionare in altre situazioni.
Nelle esercitazioni precedenti- Parametri dichiarativi e Filtro master/dettaglio con un elenco a discesa si è verificato un problema simile. La soluzione è stata inserita nel livello della logica di business. In particolare, il BLL ha esaminato il valore in ingresso e, se era NULL
o un valore riservato, la chiamata è stata indirizzata al metodo DAL che ha restituito tutti i record. Se il valore in ingresso era un valore di filtro normale, è stata effettuata una chiamata al metodo DAL che ha eseguito un'istruzione SQL che ha usato una clausola con parametri WHERE
con il valore fornito.
Sfortunatamente, l'architettura viene ignorata quando si usa SqlDataSource. È invece necessario personalizzare l'istruzione SQL per acquisire in modo intelligente tutti i record se il @MaximumPrice
parametro è NULL
o un valore riservato. Per questo esercizio, fare in modo che, se il @MaximumPrice
parametro è uguale a -1.0
, tutti i record devono essere restituiti (-1.0
funziona come valore riservato perché nessun prodotto può avere un valore negativo UnitPrice
). A tale scopo, è possibile usare l'istruzione SQL seguente:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
Questa WHERE
clausola restituisce tutti i record se il @MaximumPrice
parametro è uguale a -1.0
. Se il valore del parametro non -1.0
è , vengono restituiti solo i prodotti i cui UnitPrice
valori sono minori o uguali al valore del @MaximumPrice
parametro. Impostando il valore predefinito del @MaximumPrice
parametro su -1.0
, al caricamento della prima pagina (o ogni volta che textBox MaxPrice
è vuoto), @MaximumPrice
avrà un valore e -1.0
verranno visualizzati tutti i prodotti.
Figura 8: Ora tutti i prodotti vengono visualizzati quando la MaxPrice
casella di testo è vuota (fare clic per visualizzare l'immagine a dimensione intera)
Ci sono un paio di avvertenze da notare con questo approccio. In primo luogo, tenere presente che il tipo di dati del parametro viene dedotto dall'utilizzo nella query SQL. Se si modifica la WHERE
clausola da @MaximumPrice = -1.0
a @MaximumPrice = -1
, il runtime considera il parametro come intero. Se si tenta quindi di assegnare MaxPrice
TextBox a un valore decimale (ad esempio 5,00 ), si verificherà un errore perché non può convertire 5,00 in un numero intero. Per risolvere questo problema, assicurarsi di usare @MaximumPrice = -1.0
nella WHERE
clausola o, meglio ancora, impostare la proprietà dell'oggetto ControlParameter
Type
su Decimal .
In secondo luogo, aggiungendo l'oggetto OR @MaximumPrice = -1.0
WHERE
alla clausola , il motore di query non può usare un indice su UnitPrice
(presupponendo che ne esista uno), generando quindi un'analisi di tabella. Ciò può influire sulle prestazioni se nella tabella è presente un numero sufficientemente elevato di record Products
. Un approccio migliore consiste nello spostare questa logica in una stored procedure in cui un'istruzione IF
esegue una SELECT
query dalla Products
tabella senza una WHERE
clausola quando tutti i record devono essere restituiti o una la cui WHERE
clausola contiene solo i UnitPrice
criteri, in modo che sia possibile usare un indice.
Passaggio 3: Creazione e utilizzo di stored procedure con parametri
Le stored procedure possono includere un set di parametri di input che possono quindi essere usati nelle istruzioni SQL definite all'interno della stored procedure. Quando si configura SqlDataSource per l'uso di una stored procedure che accetta parametri di input, è possibile specificare questi valori di parametro usando le stesse tecniche delle istruzioni SQL ad hoc.
Per illustrare l'uso di stored procedure in SqlDataSource, è possibile creare una nuova stored procedure nel database Northwind denominato GetProductsByCategory
, che accetta un parametro denominato @CategoryID
e restituisce tutte le colonne dei prodotti la cui CategoryID
colonna corrisponde a @CategoryID
. Per creare una stored procedure, passare a Esplora server ed eseguire il drill-down nel NORTHWND.MDF
database. Se Esplora server non viene visualizzato, visualizzarlo passando al menu Visualizza e selezionando l'opzione Esplora server.
Dal database fare clic con il NORTHWND.MDF
pulsante destro del mouse sulla cartella Stored procedure, scegliere Aggiungi nuova stored procedure e immettere la sintassi seguente:
CREATE PROCEDURE dbo.GetProductsByCategory
(
@CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID
Fare clic sull'icona Salva (o CTRL+S) per salvare la stored procedure. È possibile testare la stored procedure facendo clic con il pulsante destro del mouse sulla stored procedure dalla cartella Stored procedure e scegliendo Esegui. Verrà richiesto di specificare i parametri della stored procedure (@CategoryID
in questa istanza), dopo di che i risultati verranno visualizzati nella finestra Output.
Figura 9: Stored GetProductsByCategory
procedure eseguita con un @CategoryID
valore pari a 1 (fare clic per visualizzare l'immagine a dimensione intera)
Usare questa stored procedure per visualizzare tutti i prodotti nella categoria Bevande in un controllo GridView. Aggiungere un nuovo controllo GridView alla pagina e associarlo a un nuovo oggetto SqlDataSource denominato BeverageProductsDataSource
. Passare alla schermata Specificare un'istruzione SQL personalizzata o una stored procedure, selezionare il pulsante di opzione Stored procedure e selezionare la GetProductsByCategory
stored procedure dall'elenco a discesa.
Figura 10: Selezionare la GetProductsByCategory
stored procedure dall'elenco Drop-Down (fare clic per visualizzare l'immagine a dimensione intera)
Poiché la stored procedure accetta un parametro di input (@CategoryID
), facendo clic su Avanti viene richiesto di specificare l'origine per il valore del parametro. Le bevande CategoryID
sono 1, quindi lasciare l'elenco a discesa Origine parametro in Nessuno e immettere 1 nella casella di testo DefaultValue.
Figura 11: Usare un valore Hard-Coded pari a 1 per restituire i prodotti nella categoria Bevande (fare clic per visualizzare l'immagine a dimensione intera)
Come illustrato nel markup dichiarativo seguente, quando si usa una stored procedure, la proprietà SqlDataSource s SelectCommand
viene impostata sul nome della stored procedure e la SelectCommandType
proprietà è impostata su StoredProcedure
, a indicare che SelectCommand
è il nome di una stored procedure anziché un'istruzione SQL ad hoc.
<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>
Testare la pagina in un browser. Vengono visualizzati solo i prodotti appartenenti alla categoria Bevande, anche se tutti i campi del prodotto vengono visualizzati poiché la GetProductsByCategory
stored procedure restituisce tutte le colonne della Products
tabella. È possibile, naturalmente, limitare o personalizzare i campi visualizzati in GridView dalla finestra di dialogo Modifica colonne di GridView.
Figura 12: Vengono visualizzate tutte le bevande (fare clic per visualizzare l'immagine a dimensione intera)
Passaggio 4: richiamare a livello di codice un'istruzione Select() di SqlDataSource
Gli esempi illustrati nell'esercitazione precedente e in questa esercitazione finora hanno associato i controlli SqlDataSource direttamente a un controllo GridView. I dati del controllo SqlDataSource, tuttavia, possono essere accessibili a livello di codice ed enumerati nel codice. Ciò può risultare particolarmente utile quando è necessario eseguire query sui dati per esaminarlo, ma non è necessario visualizzarlo. Invece di dover scrivere tutto il codice boilerplate ADO.NET per connettersi al database, specificare il comando e recuperare i risultati, è possibile consentire a SqlDataSource di gestire questo codice monotono.
Per illustrare l'uso dei dati di SqlDataSource a livello di codice, si supponga che il capo abbia contattato una richiesta per creare una pagina Web che visualizza il nome di una categoria selezionata in modo casuale e i relativi prodotti associati. Ovvero, quando un utente visita questa pagina, si vuole scegliere in modo casuale una categoria dalla Categories
tabella, visualizzare il nome della categoria e quindi elencare i prodotti appartenenti a tale categoria.
A tale scopo, sono necessari due controlli SqlDataSource uno per acquisire una categoria casuale dalla Categories
tabella e un'altra per ottenere i prodotti della categoria. Verrà compilato SqlDataSource che recupera un record di categoria casuale in questo passaggio; Il passaggio 5 esamina la creazione di SqlDataSource che recupera i prodotti della categoria.
Per iniziare, aggiungere un oggetto SqlDataSource a ParameterizedQueries.aspx
e impostarlo ID
su RandomCategoryDataSource
. Configurarlo in modo che usi la query SQL seguente:
SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()
ORDER BY NEWID()
restituisce i record ordinati in ordine casuale . Vedere Uso NEWID()
di per ordinare in modo casuale i record. SELECT TOP 1
restituisce il primo record del set di risultati. Raggruppata, questa query restituisce i valori di CategoryID
colonna e CategoryName
da una singola categoria selezionata in modo casuale.
Per visualizzare il valore della CategoryName
categoria, aggiungere un controllo Web Etichetta alla pagina, impostarne la ID
proprietà CategoryNameLabel
su e cancellarne la Text
proprietà. Per recuperare i dati a livello di codice da un controllo SqlDataSource, è necessario richiamarne il Select()
metodo. Il Select()
metodo prevede un singolo parametro di input di tipo DataSourceSelectArguments
, che specifica il modo in cui i dati devono essere messaggiati prima di essere restituiti. Ciò può includere istruzioni sull'ordinamento e il filtro dei dati e viene usato dai controlli Web dati durante l'ordinamento o il paging dei dati da un controllo SqlDataSource. Per questo esempio, tuttavia, non è necessario che i dati vengano modificati prima di essere restituiti e quindi passeranno nell'oggetto DataSourceSelectArguments.Empty
.
Il Select()
metodo restituisce un oggetto che implementa IEnumerable
. Il tipo preciso restituito dipende dal valore della proprietà del DataSourceMode
controllo SqlDataSource. Come illustrato nell'esercitazione precedente, questa proprietà può essere impostata su un valore di DataSet
o DataReader
. Se impostato su DataSet
, il Select()
metodo restituisce un oggetto DataView ; se impostato su DataReader
, restituisce un oggetto che implementa IDataReader
. Poiché La RandomCategoryDataSource
proprietà SqlDataSource è DataSourceMode
impostata su DataSet
(impostazione predefinita), verrà usata un oggetto DataView.
Il codice seguente illustra come recuperare i record da RandomCategoryDataSource
SqlDataSource come oggetto DataView e come leggere il valore della CategoryName
colonna dalla prima riga 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]
restituisce il primo DataRowView
oggetto in DataView. randomCategoryView[0]["CategoryName"]
restituisce il valore della CategoryName
colonna in questa prima riga. Si noti che DataView è tipizzato in modo libero. Per fare riferimento a un valore di colonna specifico, è necessario passare il nome della colonna come stringa ( CategoryName, in questo caso). La figura 13 mostra il messaggio visualizzato in durante CategoryNameLabel
la visualizzazione della pagina. Naturalmente, il nome effettivo della categoria visualizzato viene selezionato in modo casuale da RandomCategoryDataSource
SqlDataSource in ogni visita alla pagina (inclusi i postback).
Figura 13: Viene visualizzato il nome della categoria selezionata casualmente (fare clic per visualizzare l'immagine a dimensione intera)
Nota
Se la proprietà del controllo SqlDataSource è DataSourceMode
stata impostata su DataReader
, sarebbe necessario eseguire il Select()
cast del valore restituito dal metodo a IDataReader
. Per leggere il valore della CategoryName
colonna dalla prima riga, si usa codice simile al seguente:
if (randomCategoryReader.Read())
{
string categoryName = randomCategoryReader["CategoryName"].ToString();
...
}
Con la selezione casuale di una categoria da parte di SqlDataSource, è possibile aggiungere GridView che elenca i prodotti della categoria.
Nota
Invece di usare un controllo Web Etichetta per visualizzare il nome della categoria, è possibile aggiungere un controllo FormView o DetailsView alla pagina, associandolo a SqlDataSource. L'uso dell'etichetta, tuttavia, ha consentito di esplorare come richiamare a livello di codice l'istruzione sqlDataSource Select()
e usare i dati risultanti nel codice.
Passaggio 5: Assegnazione di valori di parametro a livello di codice
Tutti gli esempi illustrati finora in questa esercitazione hanno usato un valore di parametro hardcoded o uno tratto da una delle origini dei parametri predefinite (un valore querystring, un controllo Web nella pagina e così via). Tuttavia, i parametri del controllo SqlDataSource possono essere impostati anche a livello di codice. Per completare l'esempio corrente, è necessario un oggetto SqlDataSource che restituisce tutti i prodotti appartenenti a una categoria specificata. SqlDataSource avrà un CategoryID
parametro il Page_Load
cui valore deve essere impostato in base al CategoryID
valore della colonna restituito da RandomCategoryDataSource
SqlDataSource nel gestore eventi.
Per iniziare, aggiungere un controllo GridView alla pagina e associarlo a un nuovo oggetto SqlDataSource denominato ProductsByCategoryDataSource
. Analogamente al passaggio 3, configurare SqlDataSource in modo che richiami la GetProductsByCategory
stored procedure. Lasciare l'elenco a discesa Origine parametri impostato su Nessuno, ma non immettere un valore predefinito, perché questo valore predefinito verrà impostato a livello di codice.
Figura 14: Non specificare un'origine parametro o un valore predefinito (fare clic per visualizzare l'immagine a dimensione intera)
Al termine della procedura guidata SqlDataSource, il markup dichiarativo risultante dovrebbe essere simile al seguente:
<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
È possibile assegnare il DefaultValue
del parametro a livello di CategoryID
codice nel Page_Load
gestore eventi:
// Assign the ProductsByCategoryDataSource's
// CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters["CategoryID"].DefaultValue =
randomCategoryView[0]["CategoryID"].ToString();
Con questa aggiunta, la pagina include un controllo GridView che mostra i prodotti associati alla categoria selezionata in modo casuale.
Figura 15: Non specificare un'origine parametro o un valore predefinito (fare clic per visualizzare l'immagine a dimensione intera)
Riepilogo
SqlDataSource consente agli sviluppatori di pagine di definire query con parametri i cui valori dei parametri possono essere hardcoded, estratti da origini di parametri predefinite o assegnati a livello di codice. In questa esercitazione è stato illustrato come creare una query con parametri dalla procedura guidata Configura origine dati per query SQL ad hoc e stored procedure. È stato anche esaminato l'uso di origini di parametri hardcoded, un controllo Web come origine dei parametri e la specifica a livello di codice del valore del parametro.
Analogamente a ObjectDataSource, SqlDataSource offre anche funzionalità per modificare i dati sottostanti. Nell'esercitazione successiva verrà illustrato come definire INSERT
le istruzioni , UPDATE
e DELETE
con SqlDataSource. Dopo aver aggiunto queste istruzioni, è possibile utilizzare le funzionalità predefinite per l'inserimento, la modifica e l'eliminazione delle funzionalità intrinseche ai controlli GridView, DetailsView e FormView.
Buon programmatori!
Informazioni sull'autore
Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, lavora con le tecnologie Web Microsoft dal 1998. Scott lavora come consulente indipendente, formatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2.0 in 24 ore. Può essere raggiunto all'indirizzo mitchell@4GuysFromRolla.com. o tramite il suo blog, disponibile all'indirizzo http://ScottOnWriting.NET.
Grazie speciale a
Questa serie di esercitazioni è stata esaminata da molti revisori utili. I revisori principali di questa esercitazione erano Scott Clyde, Randell Schmidt e Ken Pespisa. Si è interessati a esaminare i prossimi articoli MSDN? In tal caso, rilasciami una riga in mitchell@4GuysFromRolla.com.