Condividi tramite


Uso di query con parametri con SqlDataSource (C#)

di Scott Mitchell

Scarica il PDF

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 , INSERTche per SELECT le istruzioni , UPDATEe 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 ProductIDcolonne , ProductNamee UnitPrice .

Selezionare le colonne da restituire da una tabella o una vista

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.

Limitare i risultati restituiti dalla finestra di dialogo Aggiungi clausola WHERE

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.

Vengono visualizzati solo i prodotti minori o uguali a $25,00

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.

Restituisce solo i prodotti minori o uguali a un valore di parametro

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.

La proprietà TextBox maxPrice viene utilizzata come origine del parametro

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 ControlParameteroggetto , 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.

Nessun record viene visualizzato quando la casella di testo MaxPrice è vuota

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.

I prodotti minori o uguali a $5,00 vengono visualizzati

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.

Ora tutti i prodotti vengono visualizzati quando la casella di testo MaxPrice è vuota

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 ControlParameterType su Decimal .

In secondo luogo, aggiungendo l'oggetto OR @MaximumPrice = -1.0WHERE 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 (@CategoryIDin questa istanza), dopo di che i risultati verranno visualizzati nella finestra Output.

Stored procedure GetProductsByCategory quando viene eseguito con una classe span <=@CategoryID di 1" />

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.

Selezionare la stored procedure GetProductsByCategory dall'elenco Drop-Down

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.

Utilizzare un valore Hard-Coded pari a 1 per restituire i prodotti nella categoria Bevande

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.

Vengono visualizzate tutte le bevande

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à CategoryNameLabelsu 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 DataSourceModecontrollo 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).

Viene visualizzato il nome della categoria selezionata casualmente

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.

Screenshot che mostra la finestra Configura origine dati con l'origine parametro impostata su Nessuno.

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.

Screenshot che mostra la pagina 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 INSERTle istruzioni , UPDATEe 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.