Gridview删除更新语句设置文档格式.docx
《Gridview删除更新语句设置文档格式.docx》由会员分享,可在线阅读,更多相关《Gridview删除更新语句设置文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
除了获取数据之外,SqlDataSource还可以以非常相似的办法通过提供INSERT、UPDATE以及DELETE语句来插入、更新以及删除数据。
只需简单的给InsertCommand、UpdateCommand以及DeleteCommand属性赋上INSERT、UPDATE以及DELETE语句就可以了。
如果语句带有参数(这也是常有的事),把这些参数放到InsertParameters、UpdateParameters以及DeleteParameters集合里就可以了。
一旦InsertCommand、UpdateCommand或DeleteCommand的值被指定,相应数据Web控件的智能标签中的“允许插入”、“允许编辑”或“允许删除”选项将会变为可用。
为了说明这个问题,我们就以在教程使用SqlDataSource
控件查询数据中创建的Querying.aspx为例,给它加上删除功能。
首先从SqlDataSource文件夹中打开InsertUpdateDelete.aspx和Querying.aspx。
在Querying.aspx的设计器中选择第一个例子中的SqlDataSource和GridView(就是ProductsDataSource和GridView1)。
选好了这两个控件之后,在“编辑”菜单中选择“复制”(或者直接Ctrl+C)。
然后,到InsertUpdateDelete.aspx的设计器中,并将这两个控件粘贴上去。
将这两个控件弄到InsertUpdateDelete.aspx上之后,在浏览器中测试一下这个页面。
你应该看到Products表中所有记录的ProductID、ProductName以及UnitPrice。
图一:
所有的产品都列出来了,并以ProductID
进行了排序
添加SqlDataSource的DeleteCommand以及DeleteParameters
属性
现在,我们拥有了一个简单的从Products表返回所有记录的SqlDataSource和一个用以显示这些数据的GridView。
我们的目标是扩展这个例子以允许用户可以通过GridView来删除产品。
要达到这个目标,我们需要给SqlDataSource控件的DeleteCommand以及DeleteParameters属性指定相关的值,并配置GridView以使其可以支持删除。
DeleteCommand以及DeleteParameters属性可以通过很多种方式进行指定:
∙通过声明标记代码;
∙通过设计器的属性窗口;
∙通过“配置数据源”向导中的
“指定一个自定义SQL语句或存储过程”页;
∙
通过“配置数据源”向导中的“指定一个表或视图中的列”页上面的“高级”按钮,它将自动的生成DELETE语句,并自动生成DeleteCommand以及DeleteParameters属性所使用到的那些参数集合。
我们将在第二步中解释如何自动创建一个DELETE语句。
虽然“配置数据源”向导或声明标记代码也OK,不过现在我们还是使用设计器中的属性窗口。
在InsertUpdateDelete.aspx的设计器中,单击一下ProductsDataSource,然后打开属性窗口(在“视图”菜单中选择“属性窗口”,或直接按F4)。
选择DeleteQuery属性。
图二:
在属性窗口中选择DeleteQuery属性
SqlDataSource并没有DeleteQuery属性。
事实上,DeleteQuery是DeleteCommand和DeleteParameters属性的结合体,它仅仅在通过设计器查看属性窗口时才显示在那里。
如果你在源视图中查看属性窗口,你将只能找到DeleteCommand属性。
点击DeleteQuery属性中的那个按钮,这时会弹出“命令和参数编辑器”对话框(见图三)。
在这里,你可以指定DELETE语句并为其指定参数。
在“DELETE命令”输入框中填上如下代码(你可以手工填写,也可以使用查询生成器,反正随你高兴):
1
DELETE
FROM
Products
2
WHERE
ProductID
=
@ProductID
然后,点击“刷新参数”按钮以将@ProductID参数添加到下面的参数列表中。
图三:
命令和参数编辑器(译者注:
原文错了,“SelecttheDeleteQueryPropertyfromthePropertiesWindow”,这是图二的描述)
不要给这个参数赋值(保留其参数源为“无”)。
在我们向GridView添加了删除支持后,GridView将通过其DataKeys集合为按下了删除按钮的那一行自动提供这个参数值。
DELETE语句中使用的参数名必须跟GridView、DetailsView或FormView的DataKeyNames相同。
也就是说,我们专门把DELETE中的那个参数命名为@ProductID(而不是@ID),是因为Products表中主键列的名称为ProductID(因此GridView的DataKeyNames值也是这个)。
如果参数名与DataKeyNames不同,GridView将无法自动通过其DataKeys集合为这个参数赋值。
在“命令和参数编辑器”对话框中输入了与删除相关的信息之后,点击“确定”,并去到源视图中看看现在的声明标记代码:
<
asp:
SqlDataSource
ID="
ProductsDataSource"
runat="
server"
ConnectionString="
%$
ConnectionStrings:
NORTHWNDConnectionString
%>
"
3
SelectCommand=
4
SELECT
[ProductID],
[ProductName],
[UnitPrice]
FROM
[Products]"
5
DeleteCommand="
DELETE
Products
WHERE
=
@ProductID"
>
6
<
DeleteParameters>
7
Parameter
Name="
ProductID"
/>
8
/DeleteParameters>
9
/asp:
SqlDataSource>
注意看看新添加的DeleteCommand属性和<
DeleteParameters>
节,还有名为productID
的Parameter对象。
配置GridView以使其可以删除
由于添加了DeleteCommand属性,GridView的智能标签现在有了“允许删除”选项。
勾上这个复选框。
就像我们在概述插入、更新和删除数据中所讨论的那样,在GridView的ShowDeleteButton属性设为true的时候,这将使其添加一个CommandField。
如图四所示,当通过浏览器访问这个页面时,GridView中将包含一个删除按钮。
通过删除一些产品来测试一下这个页面吧。
图四:
现在,每一个GridView行都包含了一个删除按钮
点击删除按钮之后,会引发一个回发,然后GridView将这一行的DataKeys集合赋值给ProductID参数,并调用SqlDataSource的Delete()方法。
接着,SqlDataSource控件就连接上数据库并执行这个DELETE语句。
最后GridView重新绑定这个SqlDataSource,并显示现在的产品集(刚刚被删除的那条记录就不见了)。
由于GridView使用其DataKeys集合来存放SqlDataSource的参数,所以我们必须注意要将GridView的DataKeyNames属性设置为主键列(也可能是复合主键),而且SqlDataSource的SelectCommand还必须要返回这些列才行。
此外,将SqlDataSource的DeleteCommand中的参数名设置为@ProductID也是非常重要的。
如果没有设置DataKeyNames属性,或者参数没有命名为@ProductsID,在点击删除按钮只会,虽然还是会有一个回发,但是将不会删除任何行。
图五向我们形象的描述了这个交互过程。
可以参考教程研究插入、更新和删除的关联事件以获取更多的有关通过数据WEB控件进行增删改操作所关联的事件链的详细信息。
图五:
在GridView中点击了删除按钮之后将调用SqlDataSource的Delete()方法
第二步:
自动生成INSERT、UPDATE以及DELETE语句
在第一步中我们了解到,INSERT、UPDATE以及DELETE语句可以通过属性窗口或控件的声明标记代码来进行指定。
不过,这需要我们手工编写SQL语句,这不仅无聊而且还容易出错。
还好,“配置数据源”向导的“指定一个表或视图中的列”页上提供了一个用于自动生成INSERT、UPDATE以及DELETE语句的选项。
好了,我们去看看这个自动生成的选项。
在InsertUpdateDelete.aspx的设计器中添加一个DetailsView,并将其ID属性设置为ManageProducts。
然后,在DetailsView的智能标签中选择创建一个新的数据源,并将其命名为ManageProductsDataSource。
图六:
创建一个名为ManageProductsDataSource的SqlDataSource
在“配置数据源”中选择NORTHWINDConnectionString,然后点击“下一步”。
在“配置Select语句”页中,选中“指定一个表或视图中的列”单选框,并在下拉框中选择Products表。
然后在下面的复选框列表中选中ProductID、ProductName、UnitPrice以及Discontinue列。
图七:
使用Products表,返回其ProductID、ProductName、UnitPrice以及Discontinue列
要根据选好的表和列自动生成INSERT、UPDATE以及DELETE语句,点击“高级”按钮并勾上“生成INSERT、UPDATE以及DELETE语句”复选框。
图八:
勾上“生成INSERT、UPDATE以及DELETE语句”复选框
只有当被选择的表含有主键且主键列包含在需要返回的列中时,“生成INSERT、UPDATE以及DELETE语句”复选框才会变为可选状态。
在“生成INSERT、UPDATE以及DELETE语句”复选框被选中之后,“使用乐观并发”复选框也会变为可选状态,它将会给最终的UPDATE和DELETE语句添加一个WHERE子句以提供乐观并发控制。
不过,现在我们不选它,我们会在下一节中介绍如何通过SqlDataSource进行乐观并发控制。
勾上了“生成INSERT、UPDATE以及DELETE语句”复选框之后,点击“确定”以返回“配置Select语句”页,然后点击“下一步”,接着点击“完成”以结束“配置数据源”向导。
在完成了这个向导之后,VisualStudio将立刻为DetailsView添加一些字段,其中ProductID、ProductName和UnitPrice对应的是BoundFields,Discontinued对应的是CheckBoxField。
在DetailsView的智能标签中,选中“允许分页”以使用户在访问这个页面时可以一页一页的查看产品。
还有清除DetailsView的Width和Height属性。
注意一下,这个智能标签中的“允许插入”、“允许编辑”以及“允许删除”的选项现在已经是可用的了。
这是因为SqlDataSource的InsertCommand、UpdateCommand以及DeleteCommand都含有了相应的SQL语句。
其声明标记代码如下所示:
DetailsView
ManageProducts"
AllowPaging="
True"
AutoGenerateRows="
False"
DataKeyNames="
DataSourceID="
ManageProductsDataSource"
EnableViewState="
Fields>
BoundField
DataField="
HeaderText="
InsertVisible="
ReadOnly="
SortExpression="
ProductName"
UnitPrice"
10
11
CheckBoxField
Discontinued"
12
13
/Fields>
14
DetailsView>
15
16
17
18
DeleteCommand=
19
[Products]
[ProductID]
20
InsertCommand=
21
INSERT
INTO
([ProductName],
[UnitPrice],
[Discontinued])
22
VALUES
(@ProductName,
@UnitPrice,
@Discontinued)"
23
24
[Discontinued]
25
26
UpdateCommand=
27
UPDATE
SET
[ProductName]
@ProductName,
28
[Discontinued]
@Discontinued
29
30
31
Type="
Int32"
32
33
UpdateParameters>
34
String"
35
Decimal"
36
Boolean"
37
38
/UpdateParameters>
39
InsertParameters>
40
41
42
43
/InsertParameters>
44
注意一下SqlDataSource控件是如何自动为其InsertCommand、UpdateCommand以及DeleteCommand属性赋值的。
InsertCommand、UpdateCommand以及DeleteCommand属性中所引用的列都是根据SELECT语句得到的。
也就是说,InsertCommand和UpdateCommand将只含有那些在SelectCommand中被指定的列,而不是Products表的所有列(除了ProductID,它被忽略是因为它是一个IDENTITY列,而IDENTITY列的值是不能修改的,只能在插入时自动赋值)。
还有,InsertCommand、UpdateCommand以及DeleteCommand属性的每一个参数都存在于相应的InsertParameters、UpdateParameters以及DeleteParameters集合中。
要打开DetailsView的数据修改功能,在其智能标签中构上“允许插入”、“允许编辑”以及“允许