从接触SqlDataSource开始,用得最多的也就这样的:


<asp:SqlDataSource ID="classType" runat="server" ConnectionString="<%$ ConnectionStrings:NewsSysConn %>"
DeleteCommand="DELETE FROM [ClassType_tb] WHERE [Id] = @Id" InsertCommand="INSERT INTO [ClassType_tb] ([TypeName], [Description]) VALUES (@TypeName, @Description)"
SelectCommand="SELECT * FROM [ClassType_tb]" UpdateCommand="UPDATE [ClassType_tb] SET [TypeName] = @TypeName, [Description] = @Description WHERE [Id] = @Id">
<DeleteParameters>
<asp:Parameter Name="Id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="TypeName" Type="String" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="Id" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="TypeName" Type="String" />
<asp:Parameter Name="Description" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
今天在一个项目中发现了这样的写法:


<asp:SqlDataSource ID="sdsClassType" runat="server" ConnectionString="<%$ ConnectionStrings:NewsSysConn %>"
OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT * FROM [ClassType_tb]"
ConflictDetection="CompareAllValues" DeleteCommand="DELETE FROM [ClassType_tb] WHERE [Id] = @original_Id"
InsertCommand="INSERT INTO [ClassType_tb] ([TypeName], [Description]) VALUES (@TypeName, @Description)"
UpdateCommand="UPDATE [ClassType_tb] SET [TypeName] = @TypeName, [Description] = @Description WHERE [Id] = @original_Id AND [TypeName] = @original_TypeName AND [Description] = @original_Description">
<DeleteParameters>
<asp:Parameter Name="original_Id" Type="Int32" />
<asp:Parameter Name="original_TypeName" Type="String" />
<asp:Parameter Name="original_Description" Type="String" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="TypeName" Type="String" />
<asp:Parameter Name="Description" Type="String" />
<asp:Parameter Name="original_Id" Type="Int32" />
<asp:Parameter Name="original_TypeName" Type="String" />
<asp:Parameter Name="original_Description" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="TypeName" Type="String" />
<asp:Parameter Name="Description" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
上网查了下,关于ConflictDetection属性的介绍如下:
ConflictDetectionConflictDetection
ConflictDetection 属性确定是将旧参数值还是将新参数值应用到 Update 方法。例如,如果 SelectCommand 属性指定的命令返回的 DataSet 对象包含列 Name 和 Number,且 ConflictDetection 属性设置为 OverwriteChanges 值,则为更新操作的 Name 和 Number 创建参数。如果 ConflictDetection 属性设置为 CompareAllValues 值,则为 Name、Number、original_Name 和 original_Number 创建参数。(原始值的确切参数名取决于 OldValuesParameterFormatString。)然后,SqlDataSourceView 对象确定 UpdateCommand 属性中指定的方法是否具有匹配的参数。
并发控制是数据存储区使用的一种技术,可用于在多个客户端访问和操作相同数据时控制如何在存储区中读取和更改这些数据。例如,一个客户端读取数据并呈现给用户,而另一个客户端读取相同的数据并呈现给其他用户。如果这两个用户都更新数据并将其提交到数据存储区,则可能会出现某种意外的结果,因为两个客户端可能会更新相同数据的不同值。这种现象被视为冲突。通过将 ConflictDetection 属性设置为 CompareAllValues 值,更新操作然后可以比较原始数据的旧值和新值以检测冲突并根据需要处理它们。
ConflictDetection 属性的值存储在视图状态中。
这里需要注意的是,如果ConflictDetection属性值为CompareAllValues,与之绑定的数据控件每列的值必须全部显示,否则无法删除并报错;倘若设置为OverwriteChanges值,出现的情况是无法更新。