Использование параметров с элементами управления источников данных

Visual Studio 2010

Обновлен: Ноябрь 2007

Элементы управления источников данных ASP.NET могут принимать входные параметры, чтобы можно было передавать им значения во время выполнения. Параметры можно использовать для того, чтобы предоставлять критерии поиска для извлечения данных, чтобы предоставлять значения для выполнения операций вставки, изменения или удаления в хранилище данных, а также для того, чтобы предоставлять значения для сортировки, разбиения по страницам и фильтрации. Использование параметров позволяет фильтровать данные и создавать приложения с отношением "основной-подробности" с минимальным количеством пользовательского кода или без него.

Параметры также можно использовать для настройки значений. передаваемых источнику данных элементом управления с привязкой к данным, например, элементом управления GridView или FormView, поддерживающим автоматические операции обновления, вставки и удаления. Например, можно использовать объекты параметров для строгой типизации значений или для извлечения выходных значений из источника данных. Кроме того, параметризованные запросы могут повысить уровень безопасности приложения путем обеспечения защиты от атак путем внедрения кода SQL.

Значения параметров можно получать из разных источников. Объекты Parameter позволяют передавать параметризованным операциям с данными значения свойств серверных веб-элементов управления, файлов Cookie, состояния сеанса, полей QueryString, свойств профилей пользователей и других источников.

Можно указать несколько типов объектов параметров в веб-приложении. Тип объекта параметра определяет, откуда исходит значение параметра. Класс Parameter является базовым классом для всех объектов параметров и включает общие для всех типов параметров свойства Name, Type, Direction и DefaultValue. Обычно базовый класс Parameter используется для указания того, как источник данных должен обрабатывать значения параметров, полученные из связанного элемента управления с привязкой к данным, например, значения, переданные элементом управления GridView для операции Update или Delete.

Типы параметров, производные от класса Parameter, можно использовать для получения значений из других источников, как описано в следующей таблице.

Тип параметра

Описание

ControlParameter

Задает для параметра значение свойства Control на веб-странице ASP.NET. Элемент управления Control указывается с помощью свойства ControlID. Имя свойства, предоставляющего значение параметра, указывается с помощью свойства PropertyName объекта ControlParameter.

В некоторых элементах управления, производных от Control, определяется атрибут ControlValuePropertyAttribute, задающий свойство по умолчанию, из которого следует извлекать значение для элемента управления. Свойство по умолчанию используется в случае, если свойство PropertyName не задано явно. Атрибут ControlValuePropertyAttribute применяется к следующим свойствам элемента управления:

CookieParameter

Задает для параметра значение объекта HttpCookie. Имя объекта HttpCookie указывается с помощью свойства CookieName. Если указанный объект HttpCookie отсутствует, то в качестве значения параметра используется значение свойства DefaultValue.

xt50s8kz.alert_note(ru-ru,VS.100).gifПримечание.
Поддерживаются только скалярные файлы Cookie (с одиночным значением).

FormParameter

Задает для параметра значение поля формы HTML. Имя поля формы HTML указывается с помощью свойства FormField. Если указанное значение поля формы HTML отсутствует, то в качестве значения параметра используется значение свойства DefaultValue.

ProfileParameter

Задает для параметра значение свойства из профиля текущего пользователя (Profile). Имя свойства профиля указывается с помощью свойства PropertyName. Если указанное свойство профиля отсутствует, то в качестве значения параметра используется значение свойства DefaultValue.

Дополнительные сведения о профилях пользователей см. в разделе Общие сведения о свойствах профилей ASP.NET.

QueryStringParameter

Задает для параметра значение поля QueryString. Имя поля QueryString указывается с помощью свойства QueryStringField. Если указанное поле QueryString отсутствует, то в качестве значения параметра используется значение свойства DefaultValue.

SessionParameter

Задает для параметра значение объекта Session. Имя объекта Session указывается с помощью свойства SessionField. Если указанный объект Session отсутствует, то в качестве значения параметра используется значение свойства DefaultValue.

Строгая типизация значений параметров

По умолчанию параметры типизируются как Object. Если значение параметра относится к другому типу, например, DateTime или Int32, то можно явно создать объекты Parameter и задать для свойства параметра Type значение TypeCode.

Направление параметра

По умолчанию параметры являются входными параметрами. В некоторых случаях, например, при использовании хранимых процедур, может возникнуть необходимость прочесть значение, возвращенное из источника данных. Если это так, то можно задать свойство Direction объекта Parameter, чтобы гарантировать получение сведений, возвращаемых источником данных веб-приложению. Поддерживаются следующие параметры направления параметра: Input, InputOutput, Output и ReturnValue. Обычно для получения возвращаемого значения параметра после завершения операции с данными используется обработчик событий элемента управления источника данных, например, для события Inserted или Updated.

Элементы управления источников данных поддерживают параметризованные операции различными способами. Например, элемент управления LinqDataSource позволяет подставлять значения в предложение в запросе LINQ во время выполнения. Элементы управления SqlDataSource и AccessDataSource позволяют указывать параметры-местозаполнители в инструкции SQL, например, в SelectCommand. Элемент управления ObjectDataSource использует параметры для определения сигнатуры метода, необходимого для вызова определенной операции с данными, например, SelectMethod. Дополнительные сведения см. в разделах Использование параметров с элементом управления SqlDataSource и Использование параметров для элемента управления ObjectDataSource.

В элементах управления источников данных обычно содержится коллекция параметров для каждой операции с данными. При выборке данных можно указать коллекцию SelectParameters, при обновлении элемента данных можно указать коллекцию UpdateParameters и т. д. Содержимое коллекции параметров для определенного действия затем используется для передачи значений базовому источнику данных. При вставке, обновлении или удалении данных элемент управления источника данных создает параметры для связанных полей, объединяет их с явно указанной коллекцией параметров (если таковая имеется) и передает результирующую коллекцию источнику данных. Дополнительные сведения об именах и значениях параметров, создаваемых элементом управления источника данных на основе данных из связанного элемента управления, см. в разделе Создание параметров для полей, привязанных к данным, элементом управления источником данных.

В следующем примере показан элемент управления SqlDataSource, извлекающий сведения на основе значения из поля QueryString.

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

В следующем примере показан элемент управления SqlDataSource, извлекающий сведения на основе значения из другого элемента управления на странице.

<asp:DropDownList id="DropDownList1" runat="server" 
    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" runat="server"
  ConnectionString="<%$ ConnectionStrings:Northwind%>"
  SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
  <SelectParameters>
    <asp:ControlParameter Name="Title" 
      ControlID="DropDownList1"
      PropertyName="SelectedValue"/>
  </SelectParameters>
</asp:sqldatasource>

В следующем примере показан элемент управления LinqDataSource, создающий предложение Where на основе значения из поля QueryString.

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

В следующем примере показан элемент управления LinqDataSource, создающий предложение Order By на основе выбора пользователя. Свойство AutoGenerateOrderByClause имеет значение true. Следовательно, элемент управления LinqDataSource создает предложение Order By с параметрами из коллекции OrderByParameters.

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

В следующем примере показан элемент управления SqlDataSource, использующий параметризованные команды для запроса и изменения данных из элемента управления источника данных. Параметры явно указываются для строгой типизации значений параметров и для указания выходных параметров.

<%@ Page language="C#" %>

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

  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 runat="server">
    <title>Northwind Employees</title>
</head>
<body>
    <form id="form1" runat="server">

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


Показ: