Condividi tramite


Utilizzo di parametri con controlli origine dati

Aggiornamento: novembre 2007

I controlli origine dati di ASP.NET possono accettare parametri di input per consentire il passaggio di valori in fase di esecuzione. È possibile utilizzare i parametri per fornire criteri di ricerca per il recupero dei dati, per fornire valori da inserire, aggiornare o eliminare in un archivio dati e per fornire valori per ordinare, effettuare il paging e filtrare. L'utilizzo dei parametri consente di filtrare i dati e creare applicazioni master-dettagli utilizzando piccole quantità di codice o nessun codice.

È inoltre possibile utilizzare i parametri anche per personalizzare i valori passati a un'origine dati da un controllo con associazione a dati, come, ad esempio, un controllo GridView o FormView, che supporta le operazioni automatiche di aggiornamento, inserimento ed eliminazione. È possibile, ad esempio, utilizzare oggetti Parameter per tipizzare fortemente i valori oppure per recuperare i valori di output dall'origine dati. Inoltre, le query con parametri possono garantire la sicurezza di un'applicazione contro gli attacchi intrusivi nel codice SQL.

È possibile ottenere i valori di parametro da diverse origini. Gli oggetti Parameter consentono di fornire valori alle operazioni dati con parametri tramite le proprietà dei controlli server Web, i cookie, lo stato sessione, i campi QueryString, le proprietà dei profili utente e altre origini.

Tipi di parametro

È possibile specificare diversi tipi di oggetti Parameter nell'applicazione Web. Il tipo di oggetto Parameter determina la provenienza del valore del parametro. La classe Parameter è la classe base per tutti gli oggetti Parameter e include le proprietà Name, Type, Direction e DefaultValue, comuni a tutti i tipi di parametro. In genere, viene utilizzata la classe base Parameter per specificare in che modo un'origine dati dovrebbe gestire i valori del parametro ottenuti da un controllo associato con associazione a dati, come i valori passati da un controllo GridView per un'operazione Update o Delete.

È possibile utilizzare i tipi di parametro che derivano dalla classe Parameter per ottenere i valori da altre origini, come descritto nella seguente tabella.

Tipo di parametro

Descrizione

ControlParameter

Imposta un parametro sul valore della proprietà di una classe Control su una pagina Web ASP.NET. Specificare la classe Control utilizzando la proprietà ControlID. Specificare il nome della proprietà che fornisce il valore del parametro utilizzando la proprietà PropertyName dell'oggetto ControlParameter.

Alcuni controlli che derivano dalla classe Control definiscono una classe ControlValuePropertyAttribute, che determina la proprietà predefinita da cui recuperare il valore del controllo. La proprietà predefinita viene utilizzata ogni volta che la proprietà PropertyName non è impostata in modo esplicito. La classe ControlValuePropertyAttribute viene applicata alle proprietà del controllo riportate di seguito:

CookieParameter

Imposta un parametro sul valore di un oggetto HttpCookie. Specificare il nome dell'oggetto HttpCookie utilizzando la proprietà CookieName. Se l'oggetto HttpCookie specificato non esiste, il valore della proprietà DefaultValue verrà utilizzato come valore del parametro.

Nota:
Sono supportati solamente i cookie a valore singolo.

FormParameter

Imposta un parametro sul valore di un campo del form HTML. Specificare il nome del campo del form HTML utilizzando la proprietà FormField. Se il valore del campo del form HTML specificato non esiste, verrà utilizzato come valore del parametro il valore della proprietà DefaultValue.

ProfileParameter

Imposta un parametro sul valore di una proprietà dal profilo utente corrente (Profile). Specificare il nome della proprietà del profilo utilizzando la proprietà PropertyName. Se la proprietà del profilo specificata non esiste, il valore della proprietà DefaultValue viene utilizzato come valore del parametro.

Per informazioni sui profili utente, vedere Cenni preliminari sulle proprietà dei profili ASP.NET.

QueryStringParameter

Imposta un parametro sul valore di un campo QueryString. Specificare il nome del campo QueryString utilizzando la proprietà QueryStringField. Se il campo QueryString specificato non esiste, viene utilizzato come valore del parametro il valore della proprietà DefaultValue.

SessionParameter

Imposta un parametro sul valore di un oggetto Session. Specificare il nome dell'oggetto Session utilizzando la proprietà SessionField. Se l'oggetto Session specificato non esiste, verrà utilizzato come valore del parametro il valore della proprietà DefaultValue.

Valori del parametro fortemente tipizzati

Per impostazione predefinita, i parametri sono tipizzati come Object. Se un valore del parametro è di un altro tipo, ad esempio DateTime o Int32, è possibile creare oggetti Parameter in modo esplicito e impostare la proprietà Type del parametro su un valore TypeCode.

Direzione del parametro

Per impostazione predefinita, i parametri sono parametri di input. In alcuni casi, come, ad esempio, quando si utilizzano le stored procedure, potrebbe essere necessario leggere un valore restituito dall'origine dati. In questo caso, è possibile impostare la proprietà Direction dell'oggetto Parameter per assicurarsi di acquisire le informazioni che l'origine dati restituisce all'applicazione Web. Le impostazioni supportate della direzione del parametro sono Input, InputOutput, Output e ReturnValue. In genere, viene gestito un evento di un controllo origine dati, come, ad esempio, un evento Inserted o Updated, per ottenere il valore restituito del parametro al termine delle operazioni dati.

Controlli origine dati e parametri

I controlli origine dati supportano le operazioni con parametri in diversi modi. Ad esempio, il controllo LinqDataSource consente di sostituire i valori runtime in una clausola di una query LINQ. I controlli SqlDataSource e AccessDataSource consentono di specificare i segnaposto di parametro in un'istruzione SQL, come SelectCommand. Il controllo ObjectDataSource utilizza i parametri per determinare la firma appropriata di un metodo per chiamare un'operazione dati specifica, come, ad esempio, SelectMethod. Per ulteriori informazioni, vedere Utilizzo dei parametri con il controllo SqlDataSource e Utilizzo dei parametri con il controllo ObjectDataSource.

In genere i controlli origine dati includono un insieme di parametri per ciascuna operazione dati. Quando si selezionano i dati, è possibile specificare un insieme SelectParameters; quando si aggiorna un elemento dati è possibile specificare un insieme UpdateParameters, e così via. I contenuti dell'insieme dei parametri per un'azione specifica sono successivamente utilizzati per fornire i valori dall'origine dati sottostante. Quando si inseriscono, aggiornano o eliminano i dati, il controllo origine dati crea parametri per i campi associati, li combina con l'eventuale insieme dei parametri specificati in modo esplicito e passa l'insieme risultante all'origine dati. Per informazioni sui nomi e sui valori dei parametri creati da un controllo origine dati sulla base dei dati restituiti da un controllo associato, vedere Come un controllo origine dati crea parametri per campi associati a dati.

Nel seguente esempio viene illustrato un controllo SqlDataSource che recupera le informazioni in base a un valore di un campo QueryString.

<asp:SqlDataSource id="Employees1" 
  ConnectionString="<%$ ConnectionStrings:Northwind %>"
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees
                 WHERE EmployeeID = @empId">
  <SelectParameters>
    <asp:QueryStringParameter Name="empId" QueryStringField="empId" />
  </SelectParameters>
</asp:SqlDataSource>

Nel seguente esempio viene illustrato un controllo SqlDataSource che recupera le informazioni in base a un valore di un altro controllo nella pagina.

<asp:DropDownList id="DropDownList1"  
    autopostback="True">
  <asp:listitem selected>Sales Representative</asp:listitem>
  <asp:listitem>Sales Manager</asp:listitem>
  <asp:listitem>Vice President, Sales</asp:listitem>
</asp:DropDownList></p>

<asp:SqlDataSource id="Employees" 
  ConnectionString="<%$ ConnectionStrings:Northwind%>"
  SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
  <SelectParameters>
    <asp:ControlParameter Name="Title" 
      ControlID="DropDownList1"
      PropertyName="SelectedValue"/>
  </SelectParameters>
</asp:sqldatasource>

Nel seguente esempio viene illustrato un controllo LinqDataSource che crea la clausola Where in base a un valore di un campo QueryString.

<asp:LinqDataSource 
      ContextTypeName="NorthwindDataContext" 
      TableName="Employees" 
      Where="EmployeeID = @empID" 
      ID="LinqDataSource1" 
      >
  <WhereParameters>
    <asp:QueryStringParameter Type="Int32" DefaultValue="1" 
        Name="empID" QueryStringField="empID" />
  </WhereParameters>
</asp:LinqDataSource>

Nel seguente esempio viene illustrato un controllo LinqDataSource che crea la clausola Order By in base alla selezione effettuata dall'utente. La proprietà AutoGenerateOrderByClause è impostata su true. Pertanto il controllo LinqDataSource crea la clausola Order By con i parametri dell'insieme OrderByParameters.

<asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
    <asp:ListItem Value="Category"></asp:ListItem>
    <asp:ListItem Value="Price"></asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    AutoGenerateOrderByClause="true"
    ID="LinqDataSource1" 
    >
    <OrderByParameters>
      <asp:ControlParameter
         ControlID="DropDownList1" 
         Type="String" />
    </OrderByParameters>
</asp:LinqDataSource>

Nel seguente esempio viene illustrato un controllo SqlDataSource che utilizza i comandi con parametri per eseguire le query e modificare i dati di un controllo con associazione dati. I parametri vengono specificati in modo esplicito per tipizzare fortemente i valori del parametro e specificare i parametri di output.

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >

  Sub EmployeesDropDownList_OnSelectedIndexChanged(sender As Object, e As EventArgs)
    EmployeeDetailsView.DataBind()
  End Sub

  Sub EmployeeDetailsView_ItemUpdated(sender As Object, e As DetailsViewUpdatedEventArgs)
    EmployeesDropDownList.DataBind()
    EmployeesDropDownList.SelectedValue = e.Keys("EmployeeID").ToString()
    EmployeeDetailsView.DataBind()
  End Sub

  Sub EmployeeDetailsView_ItemDeleted(sender As Object, e As DetailsViewDeletedEventArgs)
    EmployeesDropDownList.DataBind()
  End Sub

  Sub EmployeeDetailsSqlDataSource_OnInserted(sender As Object, e As SqlDataSourceStatusEventArgs)
    Dim command As System.Data.Common.DbCommand = e.Command  
    EmployeesDropDownList.DataBind()
    EmployeesDropDownList.SelectedValue = _
      command.Parameters("@EmpID").Value.ToString()
    EmployeeDetailsView.DataBind()
  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" >

      <h3>Northwind Employees</h3>

        <table cellspacing="10">

          <tr>
            <td valign="top">
              <asp:DropDownList ID="EmployeesDropDownList" 
                DataSourceID="EmployeesSqlDataSource" 
                DataValueField="EmployeeID" 
                DataTextField="FullName"
                AutoPostBack="True"
                OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
                RunAt="Server" />            
            </td>

            <td valign="top">                
              <asp:DetailsView ID="EmployeeDetailsView"
                DataSourceID="EmployeeDetailsSqlDataSource"
                AutoGenerateRows="false"
                AutoGenerateInsertbutton="true"
                AutoGenerateEditbutton="true"
                AutoGenerateDeletebutton="true"
                DataKeyNames="EmployeeID"     
                Gridlines="Both"
                OnItemUpdated="EmployeeDetailsView_ItemUpdated"
                OnItemDeleted="EmployeeDetailsView_ItemDeleted"      
                RunAt="server">

                <HeaderStyle backcolor="Navy"
                  forecolor="White"/>

                <RowStyle backcolor="White"/>

                <AlternatingRowStyle backcolor="LightGray"/>

                <EditRowStyle backcolor="LightCyan"/>

                <Fields>                  
                  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
                  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
                  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
                  <asp:BoundField DataField="Address"    HeaderText="Address"/>                    
                  <asp:BoundField DataField="City"       HeaderText="City"/>                        
                  <asp:BoundField DataField="Region"     HeaderText="Region"/>
                  <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>                    
                </Fields>                    
              </asp:DetailsView>
            </td>                
          </tr>            
        </table>

        <asp:SqlDataSource ID="EmployeesSqlDataSource"  
          SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees" 
          Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>" 
          RunAt="server">
        </asp:SqlDataSource>


        <asp:SqlDataSource ID="EmployeeDetailsSqlDataSource" 
          SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
                         FROM Employees WHERE EmployeeID = @EmpID"

          InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
                         VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode); 
                         SELECT @EmpID = SCOPE_IDENTITY()"

          UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
                           City=@City, Region=@Region, PostalCode=@PostalCode
                         WHERE EmployeeID=@EmployeeID"

          DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

          ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
          OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
          RunAt="server">

          <SelectParameters>
            <asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
                                  Name="EmpID" Type="Int32" DefaultValue="0" />
          </SelectParameters>

          <InsertParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
          </InsertParameters>

          <UpdateParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </UpdateParameters>

          <DeleteParameters>
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </DeleteParameters>

        </asp:SqlDataSource>
      </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >

  void EmployeesDropDownList_OnSelectedIndexChanged(Object sender, EventArgs e)
  {
    EmployeeDetailsView.DataBind();
  }

  void EmployeeDetailsView_ItemUpdated(Object sender, DetailsViewUpdatedEventArgs e)
  {
    EmployeesDropDownList.DataBind();
    EmployeesDropDownList.SelectedValue = e.Keys["EmployeeID"].ToString();
    EmployeeDetailsView.DataBind();
  }

  void EmployeeDetailsView_ItemDeleted(Object sender, DetailsViewDeletedEventArgs e)
  {
    EmployeesDropDownList.DataBind();
  }

  void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
  {
    System.Data.Common.DbCommand command = e.Command;   
    EmployeesDropDownList.DataBind();
    EmployeesDropDownList.SelectedValue = 
      command.Parameters["@EmpID"].Value.ToString();
    EmployeeDetailsView.DataBind();
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" >

      <h3>Northwind Employees</h3>

        <table cellspacing="10">

          <tr>
            <td valign="top">
              <asp:DropDownList ID="EmployeesDropDownList" 
                DataSourceID="EmployeesSqlDataSource" 
                DataValueField="EmployeeID" 
                DataTextField="FullName"
                AutoPostBack="True"
                OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
                RunAt="Server" />            
            </td>

            <td valign="top">                
              <asp:DetailsView ID="EmployeeDetailsView"
                DataSourceID="EmployeeDetailsSqlDataSource"
                AutoGenerateRows="false"
                AutoGenerateInsertbutton="true"
                AutoGenerateEditbutton="true"
                AutoGenerateDeletebutton="true"
                DataKeyNames="EmployeeID"     
                Gridlines="Both"
                OnItemUpdated="EmployeeDetailsView_ItemUpdated"
                OnItemDeleted="EmployeeDetailsView_ItemDeleted"      
                RunAt="server">

                <HeaderStyle backcolor="Navy"
                  forecolor="White"/>

                <RowStyle backcolor="White"/>

                <AlternatingRowStyle backcolor="LightGray"/>

                <EditRowStyle backcolor="LightCyan"/>

                <Fields>                  
                  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>                    
                  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
                  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
                  <asp:BoundField DataField="Address"    HeaderText="Address"/>                    
                  <asp:BoundField DataField="City"       HeaderText="City"/>                        
                  <asp:BoundField DataField="Region"     HeaderText="Region"/>
                  <asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>                    
                </Fields>                    
              </asp:DetailsView>
            </td>                
          </tr>            
        </table>

        <asp:SqlDataSource ID="EmployeesSqlDataSource"  
          SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees" 
          Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>" 
          RunAt="server">
        </asp:SqlDataSource>


        <asp:SqlDataSource ID="EmployeeDetailsSqlDataSource" 
          SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
                         FROM Employees WHERE EmployeeID = @EmpID"

          InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
                         VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode); 
                         SELECT @EmpID = SCOPE_IDENTITY()"

          UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
                           City=@City, Region=@Region, PostalCode=@PostalCode
                         WHERE EmployeeID=@EmployeeID"

          DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

          ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
          OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
          RunAt="server">

          <SelectParameters>
            <asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
                                  Name="EmpID" Type="Int32" DefaultValue="0" />
          </SelectParameters>

          <InsertParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
          </InsertParameters>

          <UpdateParameters>
            <asp:Parameter Name="LastName"   Type="String" />
            <asp:Parameter Name="FirstName"  Type="String" />
            <asp:Parameter Name="Address"    Type="String" />
            <asp:Parameter Name="City"       Type="String" />
            <asp:Parameter Name="Region"     Type="String" />
            <asp:Parameter Name="PostalCode" Type="String" />
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </UpdateParameters>

          <DeleteParameters>
            <asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
          </DeleteParameters>

        </asp:SqlDataSource>
      </form>
  </body>
</html>

Vedere anche

Attività

Procedura: aggiornare, inserire ed eliminare dati con il controllo LinqDataSource

Concetti

Utilizzo dei parametri con il controllo SqlDataSource

Utilizzo dei parametri con il controllo ObjectDataSource

Come un controllo origine dati crea parametri per campi associati a dati

Cenni preliminari sui controlli origine dati

Riferimenti

Parameter