ateEventArgs)
Response.Write("<br/>New Values passed from DetailsView<br />")
EnumerateDictionary(e.NewValues)
Response.Write("<br/>Keys passed from DetailsView<br />")
EnumerateDictionary(e.Keys)
Response.Write("<br/>Old Values passed from DetailsView<br />")
EnumerateDictionary(e.OldValues)
End Sub
Protected Sub SqlDataSource1_Updating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs)
EnumerateCommandParameters(e.Command)
e.Cancel = True
Response.Write("<br/>Update canceled")
End Sub
你可以通过向数据源使用的参数集合添加静态的Parameter对象来改变SqlDataSource附加到命令上的参数次序。SqlDataSource会根据这些参数对象的次序来重新排列数据绑定控件所传递的参数。当数据源的ProviderName属性被设置为System.Data.OleDb的时候,这种操作就有用处了,这是由于它不支持命名(named)参数,因此附加到命令上的参数的次序必须与命令中的匿名参数占位符('?')的次序相匹配。当我们使用命名参数的时候,参数的次序就是无关紧要的。你可以指定Parameter对象的Type属性,确保在执行命令或方法之前,强制数据绑定控件传递的值被转换为适当的数据类型。同样地,你还可以设置Parameter的Size属性,规定SqlDataSource命令中DbParameter的位数大小(必须用于输入/输出、输出和返回值参数)。
<asp:SqlDataSource ConnectionString="<%contentnbsp;ConnectionStrings:NorthwindOLEDB %>" ID="SqlDataSource1" ProviderName="<%contentnbsp;ConnectionStrings:NorthwindOLEDB.ProviderName %>" runat="server" SelectCommand="SELECT TOP 10 [OrderID], [OrderDate], [ShipCountry] FROM [Orders]" UpdateCommand="UPDATE [Orders] SET [OrderDate] = ?, [ShipCountry] = ? WHERE [OrderID] = ?" OnUpdating="SqlDataSource1_Updating">
<UpdateParameters>
<asp:Parameter Name="OrderDate" Type="DateTime" />
<asp:Parameter Name="ShipCountry" Type="String" />
<asp:Parameter Name="OrderID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
参数命名习惯要求新值根据数据源Select操作所选定的字段来命名。我们也可以通过指定OldValuesParameterFormatString属性(例如指定为"original_{0}")对Keys或OldValues中的参数进行重命名,以便于把它们和NewValues参数区分开来。你还可以通过处理适当的事件,在数据源操作执行之前改变参数的值,从而自定义参数名称。例如,如果SqlDataSource的更新操作与一个存储过程关联,而该存储过程使用的参数名称与默认的命名习惯不同,那么你就可以在该存储过程被调用之前,在SqlDataSource的Updating事件修改参数名称。下面的例子演示了这种技术。
Protected Sub SqlDataSource1_Updating(ByVal