当前位置: 移动技术网 > IT编程>开发语言>.net > 在ASP.NET 2.0中操作数据之四十七:用SqlDataSource控件插入、更新、删除数据

在ASP.NET 2.0中操作数据之四十七:用SqlDataSource控件插入、更新、删除数据

2017年12月12日  | 移动技术网IT编程  | 我要评论

花都艳帝txt下载,导航网址,rio 避孕药

导言:

  正如在教程里讨论的那样,gridview控件内置更新和删除功能,而detailsview和formview控件不仅具有编辑和删除功能,还有插入功能。我们不要写一行代码就可一将这些功能直接应用于一个数据源控件。在这篇教程里,我们指出objectdatasource控件最好与gridview, detailsview和formview控件一起使用,才更好的实现插入、更新和删除功能。对sqldatasource控件来说,同样如此!

  对objectdatasource控件来说,为了实现插入、更新和删除,我们需要指定调用那个方法来实现插入、更新和删除功能。对sqldatasource来说,我们需要指定insert, update和delete三种sql语句(或存储过程)。就像接下来在本章探讨的那样,我们可以手写代码或sqldatasource的设置数据源向导自动的生成。
注意:由于我们已经探讨过了gridview, detailsview和formview控件的插入、编辑和删除功能,在本章我们主要关注怎样设置sqldatasource以支持这些功能。倘若你想重温如何实现gridview, detailsview和formview的这些功能,参考教程

第一步:指定insert, update和delete命令

就像在前2章教程探讨的那样,从sqldatasource控件检索数据,需要设置2个属性:

1. connectionstring,指定要查询的数据库。
2. selectcommand,指定用来返回结果的ad-hoc sql语句或存储过程的名称。

  对selectcommand里的参数来说,其值在sqldatasource控件的selectparameters部分指定,可以为“硬编码”值,普通的参数源值(比如来自于查询字符串、 session变量、web控件等)、或通过编程设置。当一个数据web控件调用sqldatasource的select() 方法时——不管是自动的还是通过编程调用的,发生这些事件:连接指定数据库,对参数赋值并执行查询,检索并返回结果。返回的结果是dataset还是datareader,取决于sqldatasource的datasourcemode属性是设置为dataset还是datareader。

  和选择数据一样,要实现插入、更新和删除数据,我们只要提供相应的insert, update和delete sql语句就够了。方法是对insertcommand, updatecommand和deletecommand属性赋以相应的 insert, update和delete sql语句。如果这些sql语句包含参数(现实中经常碰到),将这些参数放在相应的insertparameters, updateparameters和deleteparameters部分。

  一旦指定了sqldatasource控件的insertcommand, updatecommand和deletecommand三种命令,就可以在相应的数据web控件启用插入、编辑和删除功能。为验证起见,我们拓展querying.aspx页面的删除功能。

  打开sqldatasource文件夹的insertupdatedelete.aspx和querying.aspx页面,首先选择querying.aspx页面,进入设计模式,选中sqldatasource控件和gridview控件(id分别为productsdatasource和gridview1),点“编辑”菜单,选“复制”(或直接按ctrl+c),然后将这2个控件粘贴在insertupdatedelete.aspx页面。在浏览器里测试该页面,你将会看到表products里所有产品的productid, productname和unitprice显示出来。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909034823.jpg
图1:所有产品按productid排序并显示出来

添加sqldatasource控件的eletecommand命令和deleteparameters属性

  到目前为止,我们的sqldatasource只是从表products返回记录,然后在gridview控件里显示出来。我们的目标是扩展其功能,允许用户在gridview控件删除数据。
  为此,我们需要为sqldatasource控件的deletecommand和deleteparameters属性赋值,然后启用gridview的删除功能。

可以用下面的方法为sqldatasource控件的deletecommand和deleteparameters属性赋值:

1. 声明代码
2. 在属性窗口指定属性值
3. 在设置数据源向导的“指定自定义sql语句或存储过程”界面里指定
4. 在设置数据源向导的“来自表或视图的指定列”界面里点“高级”按钮,这样做会自动生成deletecommand和deleteparameters属性里要用到的delete sql语句和参数。

  我们将在接下来的第2步探讨如何自动得生成delete语句。现在我们尝试在属性窗口里设置deletecommand和deleteparameters。当然直接声明代码和使用设置数据源向导也可以办到。

  打开insertupdatedelete.aspx页面,进入设计模式,选中id为productsdatasource的sqldatasource控件,打开其属性窗口(从视图菜单中选属性窗口,或直接按f4按钮)选择deletequery属性,在方框右边会出现一个椭圆型区域。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909037865.jpg
图2:在属性窗口里选择deletequery属性。

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

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

delete from products
where productid = @productid

  然后,点refresh parameters按钮,将参数@productid添加到下面的参数列表。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909034165.jpg
图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 id="productsdatasource" runat="server"
connectionstring="<%$ connectionstrings:northwndconnectionstring %>"
selectcommand=
 "select [productid], [productname], [unitprice] from [products]"
deletecommand="delete from products where productid = @productid">
<deleteparameters>
 <asp:parameter name="productid" />
</deleteparameters>
</asp:sqldatasource>

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

  设置了deletecommand属性后,gridview控件的智能标签里便可包含删除选项。就像在教程里探讨的一样,点击该按钮将促使gridview控件增加一个commandfield列,同时将showdeletebutton属性设置为true。就像在图4展示的那样,当通过浏览器访问该页面时,gridview控件将包含一个删除按钮。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909041152.jpg
图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形象地显示了该原理。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909044194.jpg
图5:点击gridview控件的删除按钮将会调用sqldatasource的delete()方法

第2步:自动的创建insert、update和delete语句

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

  打开insertupdatedelete.aspx页面,在设计模式里添加一个detailsview控件,设置其id为manageproducts,接下来,在其智能标签里选择“创建新数据源”,创建一个名为manageproductsdatasource的sqldatasource,如下图:

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909045480.jpg
图6:创建一个名为manageproductsdatasource的sqldatasource控件

  选择数据库时,在下拉列表中选择northwindconnectionstring连接字符串,点下一步,在“设置选择命令”界面里,选中“指定来自表或视图的列”,在下拉列表中选择表products,选中表的productid、productname、unitprice和 discontinued列。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909045009.jpg
图7:返回表products的productid、productname,、unitprice和discontinued

  为了自动创建基于选定表和选定列的insert、update和delete命令,点击“高级”按钮,选中“生成insert、update和delete命令”选项。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909044538.jpg
图8:选中“生成insert、update和delete命令”选项

  当查询返回的那些列包含主键列(有时几个列都是主键列)时,才能启用“生成insert、update和delete命令”选项。当选择了“生成insert、update和delete命令”选项后,才能选择“使用开放式并发”选项。当选择该选项后,就将在update和delete命令里增加where字句,以提供开放式并发控制。现在先不忙选择“使用开放式并发”选项,我们将在后面的教程里讨论如何使sqldatasource控件实现开放式并发。

  当选择“生成insert、update和delete命令”选项后,点“ok”回到“设置选择命令”界面,再点下一步,点完成。完成向导后,visual studio将会为detailsview控件增加productid, productname和unitprice三个绑定列(boundfields),和一个discontinued单选框列(checkboxfield )。在detailsview控件的智能标签里选择分页项,并清空detailsview的宽、高属性。

  我们注意到智能标签里还包括插入、编辑、删除选项可用,这是因为sqldatasource控件的insertcommand, updatecommand和deletecommand属性同样被赋值了。就像如下代码所示:

<asp:detailsview id="manageproducts" runat="server" allowpaging="true"
autogeneraterows="false" datakeynames="productid"
datasourceid="manageproductsdatasource" enableviewstate="false">
<fields>
 <asp:boundfield datafield="productid" headertext="productid"
  insertvisible="false" readonly="true" sortexpression="productid" />
 <asp:boundfield datafield="productname" headertext="productname"
  sortexpression="productname" />
 <asp:boundfield datafield="unitprice" headertext="unitprice"
  sortexpression="unitprice" />
 <asp:checkboxfield datafield="discontinued" headertext="discontinued"
  sortexpression="discontinued" />
</fields>
</asp:detailsview>

<asp:sqldatasource id="manageproductsdatasource" runat="server"
connectionstring="<%$ connectionstrings:northwndconnectionstring %>"
deletecommand=
 "delete from [products] where [productid] = @productid"
insertcommand=
 "insert into [products] ([productname], [unitprice], [discontinued])
  values (@productname, @unitprice, @discontinued)"
selectcommand=
 "select [productid], [productname], [unitprice], [discontinued]
  from [products]"
updatecommand=
 "update [products] set [productname] = @productname,
  [unitprice] = @unitprice, [discontinued] = @discontinued
  where [productid] = @productid">
<deleteparameters>
 <asp:parameter name="productid" type="int32" />
</deleteparameters>
<updateparameters>
 <asp:parameter name="productname" type="string" />
 <asp:parameter name="unitprice" type="decimal" />
 <asp:parameter name="discontinued" type="boolean" />
 <asp:parameter name="productid" type="int32" />
</updateparameters>
<insertparameters>
 <asp:parameter name="productname" type="string" />
 <asp:parameter name="unitprice" type="decimal" />
 <asp:parameter name="discontinued" type="boolean" />
</insertparameters>
</asp:sqldatasource>

  注意:sqldatasourc控件是如何自动的为insertcommand,updatecommand和deletecommand属性赋值的。insertcommand和updatecommand属性里涉及到的列取决于select命令里的列,换句话说,并不是表products的所有列都出现在insertcommand和updatecommand属性里。在insertcommand和updatecommand属性里只能使用selectcommand返回的那些列(列productid除外,因为它是一个identity列,identity列的值在编辑的时候不允许改变,而且新插入一条记录时,自动对identity列赋值)。另外在insertcommand, updatecommand和 deletecommand属性里出现的每个参数,在<deleteparameters>、<updateparameters>、<insertparameters>标记里都有对应的参数。

  再转向detailsview的数据修改属性,在智能标签里启用插入、编辑、删除功能。这样会添加一个commandfield,并将showinsertbutton、showeditbutton和 showdeletebutton属性设置为true。

  在浏览器访问该页,注意到编辑、删除、新建按钮出现在detailsview控件中,点“编辑”按钮,detailsview控件将进入编辑模式,那些readonly属性设置为false(默认)的绑定列将变成一个文本框,而checkboxfield将变成单选框。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909045823.jpg
图9:detailsview控件的默认编辑界面

  类似的,你可以将当前选定行删除,或向系统增加新产品记录。由于insertcommand语句里只包含productname, unitprice和discontinued三列,当完成新增记录时,其它列要么为null要么使用数据库默认值。和objectdatasource控件一样,假设数据库表中存在这样的列,其值不允许为null,且未设置默认值,如果在
insertcommand命令里未包含该列的话,当你试图执行该insert语句的时候将出错。

  注意:detailsview控件的默认插入和编辑界面不能实现用户定制和确认功能,为了能实现用户定制及添加确认控件,我们需要将绑定列(boundfields)转换成模板列(templatefields)。获得更多这方面的信息,请参阅前面的教程adding validation controls to the editing以及customizing the data modification interface 。同时谨记,当进行更新和删除操作时,detailsview控件将使用当前产品的datakey值。如果编辑或删除失败话,检查datakeynames属性是否设置正确。

自动生成sql语句的局限性

  只有当选择从表返回列时,才能选用“自动生成insert, update和delete命令”选项,从而自动生成sql语句。然而,对更复杂的查询来说,我们将像第一步那样手动书写insert, update和delete语句。 一般来说,我们在sql select命令里使用joins将不同表的不同表的数据连接起来(打个比方,我们在显示产品信息的同时希望显示供应商名字categoryname,但是products表里没有categoryname列,那就只有调动表categories的categoryname列)。同时我们对“主”表执行编辑、更新和删除操作(具体到本例,“主”表就是products表)

  对这种需要手工输入的比较复杂的查询,按以下步骤来做可以省时一些。首先,创建一个从表products返回数据的sqldatasource控件,在其“设置数据源向导”里选择“指定来自表或视图的列”模式来自动地生成insert, update和delete语句。完成设置后在属性窗口打开selectquery属性(或者直接在“设置数据源向导”里选用“自定义sql语句或存储过程”模式),最后在select命令里添加join字句。这个方法既有自动生成sql语句省时的优点,又可以自定义select语句。

  另一个局限性在于,自动生成的insert和updat命令里包含的是那些select命令返回的列,而我们实际需要插入或更新的列可能比这些列多也可能比这些列少。比如在第2步中,如果我们要将unitprice设置为只读,那么它就不应该updatecommand语句里面, 或者我们希望在新增记录时对quantityperunit赋值为“todo”,但在gridview控件里并没有显示quantityperunit列。

  对这种情况,我们需要手工输入代码。要么直接声明代码,要么在“设置数据源向导”里选择“指定sql语句或存储过程”模式,要么通过属性窗口设置。

  注意:当新增一个参数时,如果在数据web控件里没有与该参数对应的列话,我们应通过其他方法对该参数赋值:在insertcommand和updatecommand语句里通过硬编码赋值;通过预定义源(比如查询字符串、session状态,页面上的控件等)传递参数;通过编程对参数赋值。

总结:

  要使数据web控件能启用其内建的插入、编辑、删除功能,它绑定的数据源控件首先要提供这些功能函数。对sqldatasource来说,就是其insertcommand, updatecommand和deletecommand属性必须包含insert,update和delete语句。在本节教程我们探讨了手工和自动2种生成代码的方法。

  祝编程快乐!

作者简介

  本系列教程作者 scott mitchell,著有六本asp/asp.net方面的书,是4guysfromrolla.com的创始人,自1998年以来一直应用 微软web技术。大家可以点击查看全部教程《[翻译]scott mitchell 的asp.net 2.0数据教程》,希望对大家的学习asp.net有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网