注意结尾处的WHERE子句它指定要修改哪条记录下面的语法表示修改数据库中的字段Fieldl的值和参数Field 中包含的值相匹配的记录您知道要匹配的值来源于参数因为在该字段的名称前使用了@符号它指示ASPNET 从参数列表中获取该值如果没有WHERE子句这个UPDATE语句将会使用用户输入的值更新所有记录
WHERE [Field] = @Field
VWD还在数据源控件中新增了一组标记以创建UPDATE参数ASPNET 自动用当前存在于表中的值填充这些参数当用户在数据绑定控件中进行修改时ASPNET 将聪明地替换掉旧值但作为标志的惟一字段是个例外此时ASPNET 会在DataKeyNames字典中同时保存旧值和新值如本章前面介绍数据写入时所述
(任何类型的)参数都不是控件创门是位于数据源控件内的标记
<ControlParameters>可用与《UpdateParameters>一样的方式保存值<UpdateParameters>保存的是数据源控件从己有记录中读取的值而<ConbrolParameters>保存的是用户输入的值或从一些控件(不同于正在修改数据的数据绑定控件)中选择值例如修改GridVitew中的日期但希望从Calendar控件中选择该日期您在第章中创建带有主一子关系控件的页面时使用过<ControlParameters>在本章后面介绍数据写入时您将看到更多示例
在数据源控件中可以添加一个可选的属性ConflictDetection= CompareAllValues沖突探测使得DataKeyNames解决方案可以避免两个用户同时更新一条记录
在实现更新的数据绑定控件中有两处变化同时还要将控件从只读状态修改为可以更新记录(如下代码阴影部分所示)首先是增加了DataKeyNames属性其次是在字段列中增加了一个新的字段把它称作CommandField是因为它为用户提供一个按钮单击该按钮将执行一条命令只有当ASPNET 在数据绑定控件上创建一个用于显示按钮的类似字段的列时才将其看作是字段
<asp:detailsview id=DetailsView runat=server datasourceid=SqlDataSource autogeneraterows=False
datakeynames=FixtureID
Height=px Width=px>
<Fields>
<asp:BoundField DataField=FixtureID
HeaderText=FixtureID InsertVisible=False
ReadOnly=True
SortExpression=FixtureID></asp:BoundField>
<asp:BoundField DataField=FixtureDate
HeaderText=FixtureDate SortExpression=FixtureDate />
<asp:CommandField
ShowEditButton=True
ShowInsertButton=True />
</Fields>
</asp:Detailsview>
[] [] [] [] [] []