Condividi tramite


Utilizzo delle query parametrizzate con SqlDataSource (VB)

di Scott Mitchell

Scaricare 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 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 utilizzate nelle demo della precedente esercitazione mancavano di WHERE clausole. In un'istruzione SELECT, la clausola WHERE può essere usata per limitare i risultati che vengono 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 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

Il SqlDataSource supporta query con parametri, sia per le SELECT istruzioni, che per INSERT, UPDATE, e DELETE. Inoltre, i valori dei parametri possono essere estratti automaticamente da un'ampia gamma di origini, lo stato della 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 sia in modo dichiarativo che a livello di codice.

Annotazioni

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. I parametri di ObjectDataSource sono mappati ai parametri di input per i metodi nel livello di logica aziendale. 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() possono avere entrambi 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 una vista esistente,
  • Immettendo un'istruzione SQL personalizzata o
  • Scegliendo una procedura memorizzata

Quando si selezionano colonne da una tabella o vista esistente, è necessario specificare i parametri per la WHERE clausola tramite la 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 specifica 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 nella finestra di progettazione e impostarne il valore ID 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 una vista esistente (vedere la figura 1). In questo modo viene compilata automaticamente un'istruzione SQL SELECT , ovvero ciò che viene inviato al database quando viene richiamato il metodo s Select() SqlDataSource. Come abbiamo fatto nell'esercitazione precedente, selezionare la tabella Products dall'elenco a discesa e verificare le colonne ProductID, ProductName, e 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 querystring 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 utilizza un valore di parametro hard-coded (ad esempio $25,00) o se il valore del parametro deve essere specificato programmaticamente, selezionare "None" nell'elenco a discesa Origine. Quindi, immettere il valore predefinito del parametro 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)

Annotazioni

Se si possono specificare più condizioni nella clausola WHERE dalla finestra di dialogo Aggiungi la clausola WHERE, la procedura guidata le unisce con l'operatore AND. Se hai bisogno di includere un OR nella clausola WHERE (ad esempio WHERE UnitPrice <= @UnitPrice OR Discontinued = 1), devi costruire l'istruzione tramite la schermata delle istruzioni SQL personalizzate.

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 dei 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 s Select() SqlDataSource, 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 confermare questa operazione, aggiungere un controllo GridView alla pagina, associarlo a questa origine dati e quindi visualizzare la pagina in 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 GridView i cui prezzi sono inferiori a una determinata soglia. Per iniziare, aggiungere un controllo TextBox alla pagina ParameterizedQueries.aspx 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 un GridView nella pagina e dallo smart tag scegliere di creare un nuovo SqlDataSource chiamato ProductsFilteredByPriceDataSource. Dalla procedura guidata Configura origine dati, andare alla schermata Specificare un'istruzione SQL personalizzata o una stored procedure (vedere la figura 4) e inserire la query seguente:

SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0

Dopo aver immesso la query (manualmente o tramite Generatore di 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 nel MaxPrice TextBox. Per il momento, non immettere un valore predefinito.

La proprietà Text della TextBox MaxPrice è 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 ControlParameter oggetto, che include proprietà aggiuntive come ControlID e PropertyName. Quando viene richiamato il metodo s Select() SqlDataSource, ControlParameter recupera 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 TextBox MaxPrice è vuota

Figura 6: Nessun record viene visualizzato quando textBox è vuoto (MaxPrice 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 il 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 prodotti quando la pagina viene caricata per la prima volta, è consigliabile 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 incredibilmente elevato, ad esempio 1000000, poiché è improbabile che Northwind Traders abbia mai inventario il cui prezzo unitario supera $1.000.000. Tuttavia, questo approccio è miope 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 era quella di inserire questa logica nel livello della logica di business. In particolare, il BLL ha esaminato il valore in ingresso e, se è stato NULL o un valore riservato, la chiamata è stata instradata 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 usava una clausola con WHERE parametri 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 il cui valore UnitPrice è minore o uguale al valore del parametro @MaximumPrice. Impostando il valore predefinito del @MaximumPrice parametro su -1.0, nel caricamento della prima pagina (o ogni volta che textBox MaxPrice è vuoto), @MaximumPrice verrà visualizzato il valore -1.0 e tutti i prodotti verranno visualizzati.

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

Figura 8: Ora tutti i prodotti vengono visualizzati quando textBox è vuoto (MaxPrice a dimensione intera)

Ci sono un paio di avvertenze da notare con questo approccio. Prima di tutto, 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 numero intero. Se si tenta quindi di assegnare TextBox MaxPrice a un valore decimale (ad esempio 5,00 ), si verificherà un errore perché non è in grado di convertire 5,00 in un numero intero. Per risolvere questo problema, assicurarsi di usare @MaximumPrice = -1.0 nella clausola WHERE o, meglio ancora, impostare la proprietà dell'oggetto ControlParameterType su Decimale.

In secondo luogo, aggiungendo l'oggetto OR @MaximumPrice = -1.0 alla WHERE clausola , il motore di query non può usare un indice su UnitPrice (presupponendo che ne esista uno), generando così 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 eseguirebbe 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 uso 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, questi valori di parametro possono essere specificati usando le stesse tecniche delle istruzioni SQL ad hoc.

Per illustrare l'uso di stored procedure in SqlDataSource, 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 procedura memorizzata, passare a Esplora server ed esplorare in dettaglio il NORTHWND.MDF database. Se Esplora server non viene visualizzato, visualizzarlo passando al menu Visualizza e selezionando l'opzione Esplora server.

Nel database fare clic con il pulsante destro del NORTHWND.MDF 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 immettere i parametri della stored procedure (@CategoryIDin questa istanza), dopo di che i risultati verranno visualizzati nella finestra Output.

La stored procedure GetProductsByCategory quando eseguita con un valore @CategoryID di 1" />

Figura 9: GetProductsByCategory Stored Procedure quando viene eseguita con un valore @CategoryID pari a 1 (clicca per visualizzare l'immagine a dimensione intera)

Utilizziamo questa stored procedure per visualizzare tutti i prodotti nella categoria Bevande in un 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 scegliere la stored procedure GetProductsByCategory dall'elenco a discesa.

Selezionare la procedura memorizzata GetProductsByCategory dall'elenco a discesa

Figura 10: Selezionare la "Stored Procedure" dall'elenco a discesa (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>

Prova la pagina in un browser. Vengono visualizzati solo i prodotti appartenenti alla categoria Bevande, anche se tutti i campi prodotto vengono visualizzati perché la GetProductsByCategory stored procedure restituisce tutte le colonne della Products tabella. Naturalmente, è possibile limitare o personalizzare i campi visualizzati in GridView dalla finestra di dialogo Modifica colonne di GridView.

Tutte le bevande sono visualizzate

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 questa esercitazione finora hanno associato i controlli SqlDataSource direttamente a gridView. I dati del controllo SqlDataSource, tuttavia, possono essere accessibili a livello di codice ed enumerati nel codice. Ciò può essere particolarmente utile quando è necessario eseguire query sui dati per esaminarli, ma non è necessario visualizzarli. Anziché 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 l'utente con una richiesta di 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 tabella, visualizzare il nome della Categories 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à costruito il SqlDataSource che recupera un record di categoria casuale in questo passaggio. Il passaggio 5 consiste nella 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 dal set di risultati. Questa query restituisce i valori delle colonne CategoryID e CategoryName da una sola categoria selezionata casualmente.

Per visualizzare il valore della CategoryName categoria, aggiungere un controllo Web Etichetta alla pagina, impostarne la ID proprietà su CategoryNameLabele 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 visualizzati prima di essere restituiti. Ciò può includere istruzioni su come ordinare e filtrare i dati ed è utilizzato dai controlli Web dei dati durante l'ordinamento o la paginazione dei dati di un controllo SqlDataSource. Per questo esempio, tuttavia, non è necessario modificare i dati prima che vengano restituiti, e pertanto verrà passato l'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é SqlDataSource RandomCategoryDataSource ha la proprietà DataSourceMode impostata su DataSet (impostazione predefinita), si lavorerà con un oggetto DataView.

Il codice seguente illustra come recuperare i record da RandomCategoryDataSource SqlDataSource come DataView e come leggere il valore della CategoryName colonna dalla prima riga DataView:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    ' Get the data from the SqlDataSource as a DataView
    Dim randomCategoryView As DataView = CType _
        (RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty), DataView)
    If randomCategoryView.Count > 0 Then
        ' Assign the CategoryName value to the Label
        CategoryNameLabel.Text = String.Format( _
            "Here are Products in the {0} Category...", _
            randomCategoryView(0)("CategoryName").ToString())
    End If
End Sub

randomCategoryView(0) restituisce il primo DataRowView 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 determinato valore di colonna, è necessario passare il nome della colonna come stringa ( CategoryName, in questo caso). La figura 13 mostra il messaggio visualizzato in CategoryNameLabel durante 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)

Annotazioni

Se la proprietà del controllo SqlDataSource sia stata impostata su DataReader, il valore restituito dal metodo Select() avrebbe dovuto essere convertito in IDataReader. Per leggere il valore della CategoryName colonna dalla prima riga, usare il codice come segue:

If randomCategoryReader.Read() Then
   Dim categoryName as String = randomCategoryReader("CategoryName').ToString()
   ...
End If

Con la selezione casuale di una categoria da parte di SqlDataSource, è possibile aggiungere GridView che elenca i prodotti della categoria.

Annotazioni

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 questo tutorial hanno utilizzato un valore di parametro hard-coded o uno tratto da una delle fonti di parametri predefinite (un valore della querystring, un controllo Web sulla 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. Questo oggetto SqlDataSource avrà un CategoryID parametro il cui valore deve essere impostato in base al CategoryID valore della colonna restituito da RandomCategoryDataSource SqlDataSource nel Page_Load gestore eventi.

Per iniziare, aggiungere un controllo GridView alla pagina e associarlo a un nuovo oggetto SqlDataSource denominato ProductsByCategoryDataSource. Come nel passaggio 3, configurare SqlDataSource in modo che richiami la stored procedure GetProductsByCategory. Lasciare l'elenco a discesa Origine parametro impostato su Nessuno, ma non immettere un valore predefinito, poiché 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)

Dopo aver completato la 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 CategoryID parametro a livello di 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 GridView che mostra i prodotti associati alla categoria selezionata casualmente.

Schermata che mostra la pagina della categoria selezionata casualmente.

Figura 15: Non specificare un'origine parametro o un valore predefinito (fare clic per visualizzare l'immagine a dimensione intera)

Sommario

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. Inoltre, è stato esaminato l'uso di origini di parametri codificati in modo fisso, un controllo Web come origine del parametro e la specificazione a livello di codice del valore del parametro.

Analogamente a ObjectDataSource, SqlDataSource offre anche funzionalità per modificare i dati sottostanti. Nell'esercitazione successiva vedremo come creare istruzioni INSERT, UPDATE e DELETE con SqlDataSource. Dopo aver aggiunto queste istruzioni, è possibile utilizzare le funzionalità predefinite di inserimento, modifica ed eliminazione intrinseche per i controlli GridView, DetailsView e FormView.

Buon programmatori!

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, ha lavorato 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, che può essere trovato all'indirizzo http://ScottOnWriting.NET.

Grazie speciale a

Questa serie di esercitazioni è stata esaminata da diversi revisori validi. I principali revisori per questa esercitazione sono stati Scott Clyde, Randell Schmidt e Ken Pespisa. Si è interessati a esaminare i prossimi articoli MSDN? In tal caso, scrivimi a mitchell@4GuysFromRolla.com.