加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之四十八:对SqlDataSource控件使用开放

发布时间:2016-11-24 08:15:37 所属栏目:MsSql教程 来源:站长网
导读:导言: 在前面的教程里,我们考察了如何为SqlDataSource控件添加插入、更新、删除功能。简而言之,就是为其nsertCommand, UpdateCommand和DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放置在InsertParameters, UpdateParameter

  当设置SqlDataSource控件支持开放式并发时,我们需要在页面上添加一个数据Web控件,以便执行开放式并发控制。本章我们添加一个提供编辑和删除功能的GridView控件。从工具箱拖一个GridView到页面上,设置其ID为Products,并绑定到第一步添加的SqlDataSource控件ProductsDataSourceWithOptimisticConcurrency,最后启用其“编辑”和“删除”功能。

/uploads/allimg/c161121/14OI93U54T0-4RA0.gif
图6:将GridView绑定到SqlDataSource并启用编辑和删除功能

  添加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个浏览器做的修改失败了。然而,一切都发生的那么静悄悄,没有任何提示刚才发生了并发冲突!

/uploads/allimg/c161121/14OI93UQS0-491594.gif
图7:第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

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读