在ASP.NET 2.0中操作数据之四十七:用SqlDataSource控(2)

/uploads/allimg/200612/1I5511D4_0.gif


图2:在属性窗口里选择DeleteQuery属性。

  注意:SqlDataSource控件其实并没有DeleteQuery属性。或者更准确的说,它是由DeleteCommand和DeleteParameters两个属性构成的。虽然我们在设计模式里可以看到属性窗口列出了DeleteQuery属性,但切换到源码模式的时候,我们会看到代码里只有 DeleteCommand属性而没有DeleteQuery属性。

  点击该椭圆型区域,将转换到“编辑命令和属性”对话框(见图3)。在该对话框,你可以指定DELETE SQL语句及要用的参数。在DELETE: command文本框里键入如下查询:(手工输入或者借助查询生成器,悉听尊便):

DELETE FROM Products WHERE ProductID = @ProductID

  然后,点Refresh Parameters按钮,将参数@ProductID添加到下面的参数列表。

/uploads/allimg/200612/1I549C94_0.gif


图3:在属性窗口里选择DeleteQuery属性(译注:图片说明有误)

  暂时不要为该参数赋值(在参数源下列列表选“None”)。当我们为GridView控件启用删除功能后,GridView将自动为该参数传递值,传递的值为被选择删除的那行记录的DataKeys值。

  注意:在DELETE查询语句中使用的参数名必须与GridView, DetailsView或FormView控件的DataKeyNames值一样。比如:因为表Products的主键是ProductID,自然地,GridView控件的DataKeyNames值也是ProductID,相应地,DELETE语句中的参数应设置为@ProductID(当然,你也可以任意地设置为其它名字,比如@ID)。当参数名与DataKeyNames不匹配时(比如你将参数设置为@ID),GridView控件无法将DataKeys值传给SQL语句中的参数。

在“编辑命令和参数”对话框里键入相关删除信息后,点“OK”按钮。进代码模式查看代码:

<asp:SqlDataSource runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" SelectCommand= "SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]" DeleteCommand="DELETE FROM Products WHERE ProductID = @ProductID"> <DeleteParameters> <asp:Parameter /> </DeleteParameters> </asp:SqlDataSource>

设置GridView控件以支持删除功能

  设置了DeleteCommand属性后,GridView控件的智能标签里便可包含删除选项。就像在教程概述插入、更新和删除数据里探讨的一样,点击该按钮将促使GridView控件增加一个CommandField列,同时将ShowDeleteButton属性设置为true。就像在图4展示的那样,当通过浏览器访问该页面时,GridView控件将包含一个删除按钮。

/uploads/allimg/200612/1I5493511_0.gif


图4:在GridView控件中,每一行记录都包含一个删除按钮

  点击删除按钮后,将发生postback事件,GridView控件将该行记录的DataKeys值赋值给参数ProductID,并调用SqlDataSource控件的Delete()方法。SqlDataSource控件随即连接到数据库并执行DELETE命令。最后GridView控件再次绑定SqlDataSource控件,获取并展示当前的产品(因为执行了删除命令,刚被删除的那个产品也就显示不出来了)。

  注意:因为GridView控件是将它的DataKeys值传给SqlDataSource控件的参数,所以尤为重要的是将GridView的DataKeyNames属性设置为主键列,而且SqlDataSource控件的SelectCommand要返回这些列。具体到本例,最好将SqlDataSource控件的DeleteCommand里的参数设置为@ProductsID。如果DataKeyNames 属性没有设置,或参数名不是@ProductsID,点击删除按钮时也会发生postback事件,但不会成功地删除记录。

图5形象地显示了该原理。

/uploads/allimg/200612/1I55013L_0.gif


图5:点击GridView控件的删除按钮将会调用SqlDataSource的Delete()方法

第2步:自动的创建INSERT、UPDATE和DELETE语句

  就像在第1步中提到的那样,INSERT、UPDATE和DELETE SQL语句可以在属性窗口设置,也可以通过控件声明来构造。然而这样需要我们手写代码,单调且容易出错。幸运的是,我们可以通过数据源设置向导来自动的生产INSERT、UPDATE和 DELETE语句。方法是使用它的“指定来自表或视图的列”模式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwyfj.html