Utilizar parámetros con controles de origen de datos

Actualización: noviembre 2007

Los controles de origen de datos de ASP.NET pueden aceptar parámetros de entrada cuyos valores se les pueden pasar en tiempo de ejecución. Puede utilizar parámetros para proporcionar los criterios de búsqueda para una recuperación de datos; para proporcionar valores que se deben insertar, actualizar o eliminar en un almacén de datos; y para proporcionar valores para la ordenación, paginación y filtrado. El uso de parámetros permite filtrar datos y crear aplicaciones de detalles principales con poco o ningún código personalizado.

También se pueden utilizar parámetros para personalizar los valores pasados a un origen de datos por un control enlazado a datos, como un control GridView o FormView, que admita las operaciones de actualización, inserción y eliminación automáticas. Por ejemplo, puede utilizar objetos de parámetros para el establecimiento inflexible de tipos de valores o la recuperación de valores de salida del origen de datos. Además, las consultas parametrizadas pueden hacer que una aplicación sea más segura al protegerla contra los ataques de inserción de SQL.

Los valores de los parámetros se pueden obtener de diversos orígenes. Los objetos Parameter permiten proporcionar valores a las operaciones de datos parametrizados a partir de propiedades de los controles de servidor web, cookies, estado de sesión, campos QueryString, propiedades de los perfiles de usuario y otros orígenes.

Tipos de parámetros

En la aplicación Web puede especificar varios tipos de objetos de parámetros. El tipo de objeto de parámetro determina de dónde proviene el valor del parámetro. La clase Parameter es la clase base de todos los objetos de parámetros e incluye las propiedades Name, Type, Direction y DefaultValue que son comunes a todos los tipos de parámetros. Normalmente se utiliza la clase base Parameter para especificar el modo en que un origen de datos debe controlar los valores de los parámetros obtenidos a partir de un control enlazado a datos asociado, como los valores pasados por un control GridView para una operación Update o Delete.

Si lo desea, puede utilizar los tipos de parámetros que se derivan de la clase Parameter para obtener valores de otros orígenes, como se describe en la tabla siguiente.

Tipo de parámetro

Descripción

ControlParameter

Establece un parámetro en el valor de propiedad de un objeto Control de una página Web ASP.NET. El Control se especifica mediante la propiedad ControlID. El nombre de la propiedad que proporciona el valor del parámetro se especifica mediante la propiedad PropertyName del objeto ControlParameter.

Algunos controles que se derivan de Control definen un atributo ControlValuePropertyAttribute, que determina la propiedad predeterminada a partir de la cual se recupera el valor del control. La propiedad predeterminada se utiliza cuando la propiedad PropertyName no se establece de forma explícita. El atributo ControlValuePropertyAttribute se aplica a las propiedades de control siguientes:

CookieParameter

Establece un parámetro en el valor de un objeto HttpCookie. El nombre del objeto HttpCookie se especifica mediante la propiedad CookieName. Si el objeto HttpCookie especificado no existe, se utiliza el valor de la propiedad DefaultValue como valor del parámetro.

Nota:
Sólo se admiten cookies con un solo valor.

FormParameter

Establece un parámetro en el valor de un campo de formulario HTML. El nombre de este campo se especifica mediante la propiedad FormField. Si no existe el valor del campo de formulario HTML especificado, se utiliza la propiedad DefaultValue como valor del parámetro.

ProfileParameter

Establece un parámetro en el valor de una propiedad a partir del perfil de usuario actual (Profile). El nombre de la propiedad de perfil se especifica mediante la propiedad PropertyName. Si no existe la propiedad de perfil especificada, se utiliza la propiedad DefaultValue como valor del parámetro.

Para obtener información sobre los perfiles de usuario, vea Información general sobre las propiedades de perfil de ASP.NET.

QueryStringParameter

Establece un parámetro en el valor de un campo QueryString. El nombre del campo QueryString se especifica mediante la propiedad QueryStringField. Si no existe el campo QueryString especificado, se utiliza el valor de la propiedad DefaultValue como valor del parámetro.

SessionParameter

Establece un parámetro en el valor de un objeto Session. El nombre del objeto Session se especifica mediante la propiedad SessionField. Si no existe el objeto Session especificado, se utiliza el valor de la propiedad DefaultValue como valor del parámetro.

Establecimiento inflexible de tipos para los valores de los parámetros

De forma predeterminada, los parámetros pertenecen al tipo Object. Si el valor del parámetro es de otro tipo, como DateTime o Int32, puede crear objetos Parameter de forma explícita y establecer su propiedad Type en un valor TypeCode.

Dirección de los parámetros

De forma predeterminada, los parámetros son parámetros de entrada. En algunos casos, como cuando se utilizan procedimientos almacenados, puede ser necesario leer un valor devuelto desde el origen de datos. En ese caso, puede establecer la propiedad Direction del objeto Parameter para asegurarse de que captura la información que el origen de datos devuelve a la aplicación Web. Las direcciones de parámetros admitidas son Input, InputOutput, Output y ReturnValue. Generalmente deberá controlar los eventos de control de origen de datos, como el evento Inserted o Updated, para obtener el valor devuelto del parámetro una vez que haya finalizado la operación de datos.

Parámetros y controles de origen de datos

Los controles de origen de datos admiten las operaciones parametrizadas de formas diferentes. Por ejemplo, el control LinqDataSource permite sustituir los valores en tiempo de ejecución en una cláusula de una consulta LINQ. Los controles SqlDataSource y AccessDataSource permiten especificar marcadores de posición de parámetros en instrucciones SQL, como SelectCommand. El control ObjectDataSource utiliza parámetros para determinar la firma de método adecuada para solicitar una operación de datos determinada, como SelectMethod. Para obtener más información, vea Utilizar parámetros con el control SqlDataSource y Utilizar parámetros con el control ObjectDataSource.

Normalmente los controles de origen de datos incluyen una colección de parámetros para cada operación de datos. Cuando se seleccionan los datos, se puede especificar una colección SelectParameters; cuando se actualiza un elemento de datos, se puede especificar una colección UpdateParameters, y así sucesivamente. El contenido de la colección de parámetros para una acción determinada se utilizará para proporcionar valores al origen de datos subyacente. Durante la inserción, actualización o eliminación de los datos, el control de origen de datos crea parámetros para campos enlazados, los combina con la colección de parámetros especificada de forma explícita (si existe) y, a continuación, pasa la colección resultante al origen de datos. Para obtener información sobre los nombres y valores de los parámetros que crea un control de origen de datos basándose en los datos de un control enlazado, vea Cómo un control de origen de datos crea parámetros para campos enlazados a datos.

En el ejemplo siguiente se muestra un control SqlDataSource que recupera información basándose en un valor de 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>

En el ejemplo siguiente se muestra un control SqlDataSource que recupera información basándose en un valor de otro control de la página.

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

En el ejemplo siguiente se muestra un control LinqDataSource que crea la cláusula Where basándose en un valor de 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>

En el ejemplo siguiente se muestra un control LinqDataSource que crea la cláusula Order By basándose en una selección del usuario. La propiedad AutoGenerateOrderByClause se establece en true. Por consiguiente, el control LinqDataSource crea la cláusula Order By con los parámetros de la colección 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>

En el ejemplo siguiente se muestra un control SqlDataSource que utiliza comandos parametrizados para consultar y modificar los datos de un control enlazado a datos. Los parámetros se especifican de forma explícita para realizar el establecimiento inflexible de tipos de los valores de los parámetros y especificar los parámetros de salida.

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

Vea también

Tareas

Cómo: Actualizar, insertar y eliminar datos con el control LinqDataSource

Conceptos

Utilizar parámetros con el control SqlDataSource

Utilizar parámetros con el control ObjectDataSource

Cómo un control de origen de datos crea parámetros para campos enlazados a datos

Información general sobre los controles de origen de datos

Referencia

Parameter