Uso di query con parametri con SqlDataSource (VB)

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 OR @MaximumPrice = -1.0

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. Nel postback, SqlDataSource informa GridView che una delle origini dei parametri è stata modificata. Di conseguenza, GridView viene ribinato in SqlDataSource, visualizzando tali prodotti inferiori o uguali a $5,00.

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

Figura 7: i prodotti inferiori o uguali a $5,00 vengono visualizzati (Fare clic per visualizzare l'immagine a dimensioni complete)

Inizialmente visualizzazione di tutti i prodotti

Anziché visualizzare nessun 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 MaxPrice che TextBox è vuoto è impostare il valore predefinito del parametro su un valore predefinito insaneamente, come 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 è stato riscontrato un problema simile. La soluzione è stata inserita in questa logica nel livello della logica di business. In particolare, il BLL ha esaminato il valore in ingresso e, se è NULL stato o un valore riservato, la chiamata è stata indirizzata al metodo DAL che ha restituito tutti i record. Se il valore in ingresso è un valore di filtro normale, viene eseguita una chiamata al metodo DAL che ha eseguito un'istruzione SQL che ha usato una clausola con WHERE parametri con il valore specificato.

Sfortunatamente, si ignora l'architettura 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, lasciare che sia disponibile in modo che se il @MaximumPrice parametro è uguale a -1.0, tutti i record devono essere restituiti (-1.0 funziona come valore riservato poiché nessun prodotto può avere un valore negativo UnitPrice ). Per eseguire questa operazione, è 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 -1.0a . Se il valore del parametro non -1.0è , vengono restituiti solo i prodotti di cui UnitPrice è minore o uguale al valore del @MaximumPrice parametro. Impostando il valore predefinito del @MaximumPrice parametro su -1.0, nel caricamento della prima pagina (o ogni volta MaxPrice che TextBox è vuoto), @MaximumPrice verrà visualizzato un valore di -1.0 e 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 casella di testo è vuota (fare clic per visualizzare l'immagineMaxPrice full-size)

Ci sono alcuni avvisi 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 clausola da @MaximumPrice = -1.0 a @MaximumPrice = -1, il runtime considera il WHERE 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 intero. Per risolvere questo problema, assicurarsi di usare @MaximumPrice = -1.0 nella WHERE clausola o, meglio, impostare la proprietà dell'oggetto ControlParameterType su Decimal .

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 esista un elemento), causando così un'analisi di tabella. Ciò può influire sulle prestazioni se nella tabella sono presenti un numero sufficiente di record Products . Un approccio migliore consiste nel 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 essere quindi usati nelle istruzioni SQL definite all'interno della stored procedure. Quando si configura SqlDataSource per usare 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, consente di creare una nuova stored procedure nel database Northwind denominato , che accetta un parametro denominato GetProductsByCategory@CategoryID e restituisce tutte le colonne dei prodotti la cui CategoryID colonna corrisponde @CategoryIDa . Per creare una stored procedure, passare a Esplora server e 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 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 cartella Stored Procedure e scegliendo Esegui. Verrà richiesto di specificare i parametri della stored procedure (@CategoryIDin questa istanza), dopo il quale i risultati verranno visualizzati nella finestra Output.

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

Figura 9: GetProductsByCategory stored procedure quando viene eseguita con un valore di 1 (fare clic per visualizzare l'immagine@CategoryID a dimensioni complete)

È possibile usare questa stored procedure per visualizzare tutti i prodotti nella categoria Bevande in un controllo GridView. Aggiungere un nuovo gridView alla pagina e associarlo a un nuovo Oggetto SqlDataSource denominato BeverageProductsDataSource. Continuare con la schermata Specificare un'istruzione SQL o una stored procedure personalizzata, selezionare il pulsante di opzione Stored procedure e selezionare la GetProductsByCategory stored procedure dall'elenco a discesa.

Selezionare la stored procedure GetProductsByCategory nell'elenco Drop-Down

Figura 10: selezionare la stored procedure dall'elenco Drop-Down (fare clic per visualizzare l'immagineGetProductsByCategory a dimensioni complete)

Poiché la stored procedure accetta un parametro di input (@CategoryID), fare clic su Avanti richiede di specificare l'origine per il valore del parametro. Le bevande CategoryID sono 1, quindi lasciare l'elenco a discesa Origine parametri in None e immettere 1 nella casella di testo DefaultValue.

Usare 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 full-size)

Come illustrato nel markup dichiarativo seguente, quando si usa una stored procedure, la proprietà SqlDataSource s SelectCommand è impostata sul nome della stored procedure e la SelectCommandType proprietà è impostata su StoredProcedure, che indica 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 nella finestra di dialogo GridView della 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 full-size)

Passaggio 4: Chiamata a livello di codice di un'istruzione Select() di SqlDataSource

Gli esempi illustrati nell'esercitazione precedente e questa esercitazione finora hanno associato controlli SqlDataSource direttamente a 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. 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 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 tabella, visualizzare il nome della Categories categoria e quindi elencare i prodotti appartenenti a tale categoria.

A questo scopo, è necessario due controlli SqlDataSource uno per afferrare 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.

Iniziare aggiungendo un oggetto SqlDataSource a ParameterizedQueries.aspx e impostandolo ID su RandomCategoryDataSource. Configurarla 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 record in ordine casuale). SELECT TOP 1 restituisce il primo record dal set di risultati. Raggruppare questa query restituisce i CategoryID valori di colonna e CategoryName da una singola categoria selezionata in modo casuale.

Per visualizzare il valore della CategoryName categoria, aggiungere un controllo Web Label alla pagina, impostare la relativa ID proprietà su CategoryNameLabele cancellarne la Text proprietà. Per recuperare i dati a livello di codice da un controllo SqlDataSource, è necessario richiamare il Select() relativo metodo. Il Select() metodo prevede un singolo parametro di input di tipo DataSourceSelectArguments, che specifica come 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 l'esempio, tuttavia, non è necessario modificare i dati prima di essere restituiti e quindi passerà 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 ha la relativa DataSourceMode proprietà impostata su DataSet (impostazione predefinita), verrà eseguito l'uso RandomCategoryDataSource di un oggetto DataView.

Il codice seguente illustra come recuperare i record da RandomCategoryDataSource SqlDataSource come dataView e come leggere il CategoryName valore della colonna dalla prima riga di 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 valore di colonna specifico, è necessario passare il nome della colonna come stringa ( CategoryName, in questo caso). La figura 13 mostra il messaggio visualizzato nella CategoryNameLabel pagina durante la visualizzazione della pagina. Naturalmente, il nome effettivo della categoria visualizzato è 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 in modo casuale (fare clic per visualizzare l'immagine full-size)

Nota

Se la proprietà del DataSourceMode controllo SqlDataSource è stata impostata su DataReader, il valore restituito dal Select() metodo deve essere eseguito il cast in IDataReader. Per leggere il CategoryName valore della colonna dalla prima riga, usare il codice simile al seguente:

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

Con sqlDataSource selezionare in modo casuale una categoria, è possibile aggiungere GridView che elenca i prodotti della categoria.

Nota

Anziché usare un controllo Web Label per visualizzare il nome della categoria, è possibile aggiungere formView o DetailsView alla pagina, associandolo a SqlDataSource. L'uso dell'etichetta, tuttavia, consente 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 hard coded o uno tratto da una delle origini dei parametri pre-definite (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. Questo oggetto SqlDataSource avrà un CategoryID parametro il cui valore deve essere impostato in base al valore di CategoryID colonna restituito dal RandomCategoryDataSource gestore eventi SqlDataSource Page_Load .

Iniziare aggiungendo gridView alla pagina e associandolo a un nuovo oggetto SqlDataSource denominato ProductsByCategoryDataSource. Analogamente al passaggio 3, configurare SqlDataSource in modo da richiamare la GetProductsByCategory stored procedure. Lasciare l'elenco a discesa Origine parametri impostato su Nessuno, ma non immettere un valore predefinito, perché verrà impostato questo valore predefinito a livello di codice.

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

Figura 14: Non specificare un'origine dei parametri o un valore predefinito (fare clic per visualizzare l'immagine a dimensioni complete)

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 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 casualmente.

Figura 15: Non specificare un'origine dei parametri o un valore predefinito (fare clic per visualizzare l'immagine full-size)

Riepilogo

SqlDataSource consente agli sviluppatori di pagine di definire query con parametri i cui valori dei parametri possono essere hard coded, estratti da origini parametri pre-definite 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 delle origini dei parametri hard coded, un controllo Web come origine dei parametri e la specifica a livello di codice del valore del parametro.

Come per ObjectDataSource, SqlDataSource offre anche funzionalità per modificare i dati sottostanti. Nell'esercitazione successiva verrà illustrato come definire INSERT, UPDATEe DELETE istruzioni con SqlDataSource. Dopo aver aggiunto queste istruzioni, è possibile usare l'inserimento, la modifica e l'eliminazione di funzionalità intrinseche ai controlli GridView, DetailsView e FormView.

Programmazione felice!

Informazioni sull'autore

Scott Mitchell, autore di sette libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, ha lavorato con le tecnologie Microsoft Web dal 1998. Scott lavora come consulente indipendente, allenatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2,0 in 24 Ore. Può essere raggiunto a mitchell@4GuysFromRolla.com. o tramite il suo blog, che può essere trovato in http://ScottOnWriting.NET.

Grazie speciali

Questa serie di esercitazioni è stata esaminata da molti revisori utili. I revisori principali per questa esercitazione sono stati Scott Clyde, Randell Schmidt e Ken Pespisa. Interessati a esaminare i prossimi articoli MSDN? In tal caso, lasciami una riga in mitchell@4GuysFromRolla.com.