Создание параметров для полей, привязанных к данным, элементом управления источником данных
Обновлен: Ноябрь 2007
При использовании элемента управления с привязкой к данным, такого как элементы управления ASP.NET с привязкой к данным GridView, DetailsView или FormView, он может передавать имена и значения параметров элементу управления с привязкой к данным, основываясь на полях, привязанных к данным в элементе управления с привязкой к данным. Для операции обновления или удаления элемент управления источником данных включает значения и имена полей в коллекцию параметров. Дополнительные сведения см. в разделах Использование параметров с элементом управления SqlDataSource и Использование параметров для элемента управления ObjectDataSource.
Словари, передаваемые в элементы управления источниками данных
Если элемент управления с привязкой к данным запрашивает операцию у элемента управления источником данных, то он передает одну или более коллекций IDictionary, содержащих значения и имена параметров для запрашиваемой операции с данными. Значения в парах "имя/значение" в словаре наследуются из дочерних элементов управления. Например, при операции обновления элемент управления с привязкой к данным считывает значения параметров из элемента управления TextBox или CheckBox, которые отображаются в режиме редактирования. Имена в парах "имя/значение" берутся из имен полей, привязанных к дочерним элементам управления, и из имен полей, указанных в свойстве DataKeyNames. Для проведения операции обновления или удаления элемент управления с привязкой к данным должен также передавать словарь, содержащий исходные значения записи данных.
Пары "имя/значение" передаются при помощи следующих коллекций IDictionary:
Коллекция Values Передается при операции вставки. Содержит пары "имя/значение" для новой записи. Имена и значения полей для коллекции Values берутся из дочерних элементов управления в InsertItemTemplate или из привязанных полей в элементе управления DetailsView, значение свойства InsertVisible которого принимает значение true.
Коллекция Keys Передается при операциях обновления и удаления. Содержит первичный ключ или ключи для обновляемой или удаляемой записи. Если ключевые поля могут изменяться в источнике данных, то коллекция Keys также содержит исходные значения ключевых полей. Если элемент управления с привязкой к данным заполняется данными из элемента управления источником данных, то он сохраняет данные в состоянии просмотра. При запросе операции обновления или удаления коллекция Keys заполняется значениями, ранее сохраненными в состоянии просмотра. Если свойство EnableViewState элемента управления с привязкой к данным имеет значение false, то коллекция Keys не заполняется при операциях обновления или удаления.
Коллекция NewValues Передается при операции обновления. Содержит пары "имя-значение" с новыми значениями для обновленного элемента, включая новые значения для обновляемых ключевых полей. Имена и значения полей для коллекции NewValues берутся из дочерних элементов управления в EditItemTemplate или из привязанных полей в элементе управления DetailsView, значение свойства ReadOnly которого принимает значение false.
Коллекция OldValues Передается при операциях обновления или удаления. Содержит исходные значения записи данных, используемые для проверки оптимистического параллелизма. (Дополнительные сведения о проверке оптимистического параллелизма обратитесь к свойству ConflictDetection элемента управления источником данных, с которым работаете.) Значения ключевых полей, определяемые свойством DataKeyNames , не включаются в коллекцию OldValues. Имена и значения ключевых полей включаются только в коллекцию Keys. Если элемент управления с привязкой к данным заполняется данными из элемента управления источником данных, то он сохраняет данные в состоянии просмотра. При запросе операции обновления или удаления коллекция OldValues заполняется значениями, ранее сохраненными в состоянии просмотра. Если свойство EnableViewState элемента управления с привязкой к данным имеет значение false, то коллекция OldValues не заполняется при операциях обновления или удаления.
Получить доступ ко всем этим коллекциям можно при помощи аргументов, передаваемых с событием элемента управления с привязкой к данным для запрашиваемой операции. Например, в событии RowUpdating элемента управления GridView класс GridViewUpdateEventArgs предоставляет доступ к коллекции NewValues.
Имена параметров
Элемент управления источником данных автоматически создает параметры для передаваемых в коллекции IDictionary значений. Для операции вставки элемент управления источником данных заполняет коллекцию InsertParameters значениями пар "имя/значение" из коллекции Values. Для операции обновления элемент управления источником данных заполняет коллекцию UpdateParameters значениями пар "имя/значение" из коллекций Keys, NewValues и OldValues. Для операции удаления элемент управления источником данных заполняет коллекцию DeleteParameters значениями пар "имя/значение" из коллекций Keys и OldValues.
Коллекция OldValues не заполняется по умолчанию. Она заполняется, только если свойство ConflictDetection элемента управления источником данных имеет значение CompareAllValues.
Для операций обновления и удаления по умолчанию создаются только параметры текущих привязанных значений. Если необходимо получить доступ к текущим и исходным привязанным значениям (например для поддержки проверки оптимистического параллелизма), то можно сделать так, чтобы элемент управления источником данных создавал параметры для текущих и исходных значений. Чтобы это сделать, необходимо задать правила именования для параметров, которые будут содержать исходные значения. Формат параметров для исходных значений определяется свойством OldValuesParameterFormatString. Установите свойство OldValuesParameterFormatString равным строке, содержащей "{0}" в качестве местозаполнителя для имени поля. Например, если используется элемент управления SqlDataSource и свойство OldValuesParameterFormatString установлено равным "old_{0}", то имена параметров исходных значений будут разрешаться в имя поля с префиксом "@old_". (Элемент управления SqlDataSource добавляет в начало имен всех параметров значение свойства символ "@".) Рассмотрим операцию обновления для поля с именем LastModifiedDate. Текущее значение поля передается в словарь Values, а исходное значение поля передается в словарь OldValues. Параметр с именем @LastModifiedDate создается для передачи текущего значения, а параметр с именем @old\_LastModifiedDate — для передачи исходного значения. Затем можно включить оба параметра в инструкцию SQL, чтобы различать текущие и исходные значения поля, как показано в следующем примере:
UPDATE Table1 SET LastModifiedDate = @LastModifiedDate
WHERE Key = @Key AND LastModifiedDate = @old_LastModifiedDate
Нет необходимости обращаться к коллекциям "имя/значение" IDictionary напрямую. Можно просто включить автоматически создаваемые имена параметров в инструкцию SQL (если источник данных поддерживает указанные параметры), или имена параметров для методов работы с данными в бизнес-объектах, к которым получается доступ при помощи элемента управления ObjectDataSource.
При необходимости можно задать объект Parameter в коллекциях UpdateParameters, InsertParameters или DeleteParameters элемента управления источником данных, чтобы настроить передаваемые элементом управления с привязкой к данным значения. Можно создать объекты Parameter, чтобы строго типизировать значения или указать значения по умолчанию при передаче null.
В следующем примере показан элемент управления DetailsView, связанный с элементом управления SqlDataSource. Свойства InsertCommand, UpdateCommand и DeleteCommand элемента управления SqlDataSource используют имена параметров, которые автоматически создаются элементом управления SqlDataSource. Значения параметров заполняются, основываясь на словарях Keys и NewValues. Словарь OldValues не используется, так как свойство ConflictDetection имеет по умолчанию значение ConflictOptions.OverwriteChanges.
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
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 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>
<%@ 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>
См. также
Основные понятия
Использование параметров с элементами управления источников данных
Использование параметров с элементом управления SqlDataSource
Использование параметров для элемента управления ObjectDataSource