Utilisation de paramètres avec des contrôles de source de données

Mise à jour : novembre 2007

Les contrôles de source de données ASP.NET peuvent accepter des paramètres d'entrée afin que vous puissiez leur passer des valeurs au moment de l'exécution. Les paramètres peuvent vous servir à fournir des critères de recherche pour l'a récupération de données, à fournir des valeurs à insérer, à mettre à jour ou à supprimer dans un magasin de données, et à fournir des valeurs servant à trier, paginer et filtrer. Utiliser des paramètres vous permet de filtrer les données et de créer des applications maître/détail en n'utilisant que peu ou pas de code personnalisé.

Les paramètres peuvent également servir à personnaliser les valeurs passées à une source de données par un contrôle lié aux données, tel qu'un contrôle GridView ou FormView, capable de prendre en charge des opérations de mise à jour, d'insertion et de suppression automatiques. Par exemple, vous pouvez utiliser des objets paramètre pour typer fortement des valeurs ou récupérer des valeurs de sortie dans la source de données. En outre, les requêtes paramétrées peuvent contribuer à sécuriser les applications en les protégeant contre les attaques d'injection SQL.

Les valeurs des paramètres peuvent être récupérées à partir de diverses sources. Les objets Parameter vous permettent de fournir à des opérations de données paramétrées des valeurs provenant de propriétés de contrôles serveur Web, de cookies, d'états de session, de champs QueryString, de propriétés de profil utilisateur et de bien d'autres sources encore.

Types de paramètres

Vous pouvez spécifier plusieurs types d'objets paramètres dans votre application Web. Le type de l'objet paramètre détermine d'où provient sa valeur. La classe Parameter est la classe de base pour tous les objets paramètres et inclut les propriétés Name, Type, Direction et DefaultValue, communes à tous les types de paramètres. Vous utiliserez en général la classe de base Parameter pour spécifier comment une source de données doit gérer les valeurs de paramètre obtenues à partir d'un contrôle associé lié aux données, par exemple les valeurs passées par un contrôle GridView pour une opération Update ou Delete.

Vous pouvez utiliser des types de paramètres dérivant de la classe Parameter pour obtenir des valeurs depuis d'autres sources, comme le montre le tableau suivant.

Type de paramètres

Description

ControlParameter

Attribue à un paramètre la valeur de propriété d'un Control dans une page Web ASP.NET. Vous spécifiez Control à l'aide de la propriété ControlID. Le nom de la propriété qui fournit la valeur de paramètre se spécifie à l'aide de la propriété PropertyName de l'objet ControlParameter.

Certains contrôles qui dérivent de Control définissent un ControlValuePropertyAttribute, ce qui détermine la propriété par défaut dans laquelle récupérer la valeur du contrôle. La propriété par défaut est utilisée chaque fois que la propriété PropertyName n'est pas définie explicitement. ControlValuePropertyAttribute est appliqué aux propriétés de contrôle suivantes :

CookieParameter

Attribue à un paramètre la valeur d'un objet HttpCookie. Le nom de l'objet HttpCookie se spécifie à l'aide de la propriété CookieName. Si l'objet HttpCookie spécifié n'existe pas, la valeur de la propriété DefaultValue est utilisée comme valeur du paramètre.

Remarque :
Seuls les cookies à valeur unique sont pris en charge.

FormParameter

Attribue à un paramètre la valeur d'un champ de formulaire HTML. Le nom du champ de formulaire HTML se spécifie à l'aide de la propriété FormField. Si la valeur du champ de formulaire HTML spécifié n'existe pas, la valeur de la propriété DefaultValue est utilisée comme valeur de paramètre.

ProfileParameter

Attribue à un paramètre la valeur d'une propriété du profil utilisateur actuel (Profile). Le nom de la propriété de profil se spécifie à l'aide de la propriété PropertyName. Si la propriété de profil spécifiée n'existe pas, la valeur de la propriété DefaultValue est utilisée comme valeur du paramètre.

Pour plus d'informations sur les profils utilisateur, consultez Vue d'ensemble des propriétés du profil ASP.NET.

QueryStringParameter

Attribue à un paramètre la valeur d'un champ QueryString. Le nom du champ QueryString se spécifie à l'aide de la propriété QueryStringField. Si le champ QueryString spécifié n'existe pas, la valeur de la propriété DefaultValue est utilisée comme valeur du paramètre.

SessionParameter

Attribue à un paramètre la valeur d'un objet Session. Le nom de l'objet Session se spécifie à l'aide de la propriété SessionField. Si l'objet Session spécifié n'existe pas, la valeur de la propriété DefaultValue est utilisée comme valeur du paramètre.

Typage fort des valeurs de paramètre

Par défaut, les paramètres sont de type Object. Si une valeur de paramètre est d'un type différent, comme DateTime ou Int32, vous pouvez créer des objets Parameter explicitement et attribuer à la propriété Type du paramètre une valeur TypeCode.

Direction du paramètre

Les paramètres sont par défaut des paramètres d'entrée. Dans certains cas, par exemple lorsque vous utilisez des procédures stockées, vous pourrez avoir à lire une valeur retournée par la source de données. Vous pourrez alors définir la propriété Direction de l'objet Parameter pour être sûr de capturer les informations que la source de données retourne à votre application Web. Les paramètres de direction du paramètre pris en charge sont Input, InputOutput, Output et ReturnValue. Vous gérerez en général un événement de contrôle de source de données, par exemple un événement Inserted ou Updated, pour obtenir la valeur de retour du paramètre une fois l'opération de données terminée.

Paramètres et contrôles de source de données

Les contrôles de source de données prennent en charge les opérations paramétrées de diverses manières. Par exemple, le contrôle LinqDataSource vous permet de substituer des valeurs runtime dans une clause d'une requête LINQ. Les contrôles SqlDataSource et AccessDataSource vous permettent de spécifier des espaces réservés aux paramètres dans une instruction SQL, par exemple SelectCommand. Le contrôle ObjectDataSource utilise des paramètres pour déterminer la signature de méthode appropriée pour faire appel à une opération de données particulière, telle que SelectMethod. Pour plus d'informations, consultez Utilisation de paramètres avec le contrôle SqlDataSource et Utilisation de paramètres avec le contrôle ObjectDataSource.

Les contrôles de source de données comprennent en général une collection de paramètres pour chaque opération de données. Lorsque vous sélectionnez des données, vous pouvez spécifier une collection SelectParameters. Lorsque vous mettez à jour un élément de données, vous pouvez spécifier une collection UpdateParameters, et ainsi de suite. Le contenu de la collection de paramètres d'une action sert alors à fournir des valeurs à la source de données sous-jacente. Au moment de l'insertion, de la mise à jour ou de la suppression des données, le contrôle de source de données crée des paramètres pour les champs liés, les combine à la collection de paramètres (le cas échéant) explicitement spécifiée, puis passe la collection résultante à la source de données. Pour plus d'informations sur les noms et les valeurs de paramètre qu'un contrôle de source de données crée à partir des données d'un contrôle lié, consultez Comment un contrôle de source de données crée des paramètres pour des champs liés aux données.

L'exemple suivant montre un contrôle SqlDataSource qui récupère des informations basées sur une valeur d'un champ 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>

L'exemple suivant montre un contrôle SqlDataSource qui récupère des informations basées sur une valeur d'un autre contrôle de la page.

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

L'exemple suivant illustre un contrôle LinqDataSource qui crée la clause Where à partir de la valeur d'un champ 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>

L'exemple suivant illustre un contrôle LinqDataSource qui crée la clause Order By à partir d'une sélection effectuée par l'utilisateur. La propriété AutoGenerateOrderByClause a la valeur true. Par conséquent, le contrôle LinqDataSource crée la clause Order By avec les paramètres de la collection 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>

L'exemple de code suivant illustre un contrôle SqlDataSource qui utilise des commandes paramétrées pour interroger et modifier les données d'un contrôle lié aux données. Les paramètres sont explicitement spécifiés pour typer fortement des valeurs de paramètre et pour spécifier des paramètres de sortie.

<%@ 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>

Voir aussi

Tâches

Comment mettre à jour, insérer et supprimer des données avec le contrôle LinqDataSource

Concepts

Utilisation de paramètres avec le contrôle SqlDataSource

Utilisation de paramètres avec le contrôle ObjectDataSource

Comment un contrôle de source de données crée des paramètres pour des champs liés aux données

Vue d'ensemble des contrôles de source de données

Référence

Parameter