在ASP.NET 2.0中操作数据之四十八:对SqlDataSource控件使用开放
当设置SqlDataSource控件支持开放式并发时,我们需要在页面上添加一个数据Web控件,以便执行开放式并发控制。本章我们添加一个提供编辑和删除功能的GridView控件。从工具箱拖一个GridView到页面上,设置其ID为Products,并绑定到第一步添加的SqlDataSource控件ProductsDataSourceWithOptimisticConcurrency,最后启用其“编辑”和“删除”功能。
添加GridView控件后,优化其界面。将ProductID列移除;将ProductName列的HeaderText属性设置为“Product”;同样,UnitPrice列的设置为“Price”。另外,我们最好为ProductName添加一个RequiredFieldValidator控件;为UnitPrice添加一个CompareValidator控件(确保其为格式化的数字值)。参考教程Customizing the Data Modification Interface看如何自定义GridView界面。 注意:必须确保激活GridView控件的view state(视图状态),因为GridView控件传递原始值时,将原始值保存在view state中。 对GridView控件做了这些修改后,GridView控件和SqlDataSource控件的声明代码看起来和下面的差不多: <asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency" runat="server" ConflictDetection="CompareAllValues" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" DeleteCommand= "DELETE FROM [Products] WHERE [ProductID] = @original_ProductID AND [ProductName] = @original_ProductName AND (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL) OR ([UnitPrice] = @original_UnitPrice)) AND [Discontinued] = @original_Discontinued" OldValuesParameterFormatString= "original_{0}" SelectCommand= "SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued] FROM [Products]" UpdateCommand= "UPDATE [Products] SET [ProductName] = @ProductName, [UnitPrice] = @UnitPrice, [Discontinued] = @Discontinued WHERE [ProductID] = @original_ProductID AND [ProductName] = @original_ProductName AND (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL) OR ([UnitPrice] = @original_UnitPrice)) AND [Discontinued] = @original_Discontinued"> <DeleteParameters> <asp:Parameter Name="original_ProductID" Type="Int32" /> <asp:Parameter Name="original_ProductName" Type="String" /> <asp:Parameter Name="original_UnitPrice" Type="Decimal" /> <asp:Parameter Name="original_Discontinued" Type="Boolean" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="ProductName" Type="String" /> <asp:Parameter Name="UnitPrice" Type="Decimal" /> <asp:Parameter Name="Discontinued" Type="Boolean" /> <asp:Parameter Name="original_ProductID" Type="Int32" /> <asp:Parameter Name="original_ProductName" Type="String" /> <asp:Parameter Name="original_UnitPrice" Type="Decimal" /> <asp:Parameter Name="original_Discontinued" Type="Boolean" /> </UpdateParameters> </asp:SqlDataSource> <asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsDataSourceWithOptimisticConcurrency"> <Columns> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <asp:BoundField DataField="UnitPrice" HeaderText="Price" SortExpression="UnitPrice" /> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" /> </Columns> </asp:GridView> 来实际地感受一下开放式并发控制。在2个浏览器里同时打开OptimisticConcurrency.aspx页面,且都点击第一条记录的编辑按钮。在第一个浏览器里改变产品名称并点“编辑”。浏览器将发生回传,GridView控件又回到“预编辑”状态,显示新的产品名称。 在第2个浏览器里,改变产品的价格(不要改产品名称)后,点“编辑”。发生回传,GridView控件又回到“预编辑”状态,和第1个浏览器显示的结果一样——产品的名称改变了但价格没改变,第2个浏览器做的修改失败了。然而,一切都发生的那么静悄悄,没有任何提示刚才发生了并发冲突!
第2个浏览器更新失败的原因在于:UPDATE命令中WHERE字句过滤掉了所以的记录,没有影响到任何一行记录(即没找到满足条件的记录)。我们再来看UPDATE 语句: UPDATE [Products] SET [ProductName] = @ProductName, [UnitPrice] = @UnitPrice, [Discontinued] = @Discontinued WHERE [ProductID] = @original_ProductID AND [ProductName] = @original_ProductName AND (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL) OR ([UnitPrice] = @original_UnitPrice)) AND [Discontinued] = @original_Discontinued (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |