首页 > 开发 > 综合 > 正文

简述DbDataAdapter.update 方法

2024-07-21 02:23:35
字体:
来源:转载
供稿:网友
简述dbdataadapter.update 方法





当应用程序调用 update 方法时,dbdataadapter 根据 dataset 中配置的索引顺序为每一行检查 rowstate 属性,并迭代执行所需的 insert、update 或 delete 语句。例如,由于 datatable 中行的排序,update 可能先执行一个 delete 语句,接着执行一个 insert 语句,然后再执行另一个 delete 语句。

应注意,这些语句不是作为批处理进程执行的;每一行都是单独更新的。在必须控制语句类型顺序的情况下(例如,insert 在 update 之前),应用程序可以调用 getchanges 方法。

如果未指定 insert、update 或 delete 语句,update 方法会生成异常。但是,如果设置 .net framework 数据提供程序的 selectcommand 属性,则可以创建 sqlcommandbuilder 或 oledbcommandbuilder 对象来为单个表更新自动生成 sql 语句。然后,commandbuilder 将生成其他任何未设置的 sql 语句。此生成逻辑要求 dataset 中存在键列信息。

update 方法支持以下情况:dataset 包含多个 datatable 对象,而这些对象的名称只有大小写不同。当 dataset 中有多个表具有相同的名称但大小写不同时,update 执行区分大小写的比较以查找相应的表,如果不存在完全匹配的表,就会生成一个异常。下面的代码阐释该行为。

dataset ds = new dataset();
ds.tables.add("aaa");
ds.tables.add("aaa");
adapter.update(ds, "aaa"); // updates "aaa", which already exists in the dataset.
adapter.update(ds, "aaa"); // updates "aaa", which already exists in the dataset.
adapter.update(ds, "aaa"); // results in an exception.
如果调用 update 并且 dataset 只包含一个其名称只有大小写不同的 datatable,则更新该 datatable。在这种情况下,比较不区分大小写。下面的 c# 代码阐释该行为。

dataset dataset = new dataset();
dataset.tables.add("aaa");
adapter.update(dataset, "aaa"); // updates table "aaa" because only one similarly named table is in the dataset.


update 方法在执行更新之前从第一个映射列出的表中检索行。然后,update 使用 updatedrowsource 属性的值刷新该行。忽略返回的任何其他行。



updatedrowsource属性 获取或设置命令结果在由 dbdataadapter 的 update 方法使用时如何应用于 datarow。默认的 updaterowsource 值为 both,除非自动生成该命令(如 oledbcommandbuilder 这样的情况),这时默认值为 none。在其他非自动生成命令情况下,不管使用代码还是通过查询设计器,通过设置命令的commandtext属性创建的命令对象都是默认值为both。



成员名称
说明

both
将输出参数和第一个返回行都映射到 dataset 中的已更改的行。

firstreturnedrecord
将第一个返回行中的数据映射到 dataset 中的已更改的行。

none
忽略任何返回的参数或行。

outputparameters
将输出参数映射到 dataset 中的已更改的行。





在将任何数据加载回 dataset 之后,将引发 onrowupdated 事件,从而允许用户检查经协调的 dataset 行以及该命令返回的任何输出参数。在对一行成功进行更新之后,将接受对该行的更改。

当使用 update 时,执行的顺序如下:

1. 将 datarow 中的值移至参数值。

2. 引发 onrowupdating 事件。

3. 执行命令。

4. 如果该命令设置为 firstreturnedrecord,返回的第一项结果将放置在 datarow 中。

5. 如果存在输出参数,它们将被放在 datarow 中。

6. 引发 onrowupdated 事件。

7. 调用 acceptchanges。

与 dbdataadapter 关联的每个命令通常都有一个与其关联的参数集合。参数通过 .net framework 数据提供程序的 parameter 类的 sourcecolumn 和 sourceversion 属性映射到当前行。sourcecolumn 引用 datatable 列,而 dbdataadapter 引用该列来获取当前行的参数值。

sourcecolumn 在应用任何表映射之前将引用未映射的列名。如果 sourcecolumn 引用一个不存在的列,则采取的操作取决于以下 missingmappingaction 值之一。

n missingmappingaction.passthrough 如果不存在任何映射,则使用 dataset 中的源列名和表名。

n missingmappingaction.ignore 生成 systemexception。当显式设置映射时,缺少输入参数的映射通常是由于出错所致。

n missingmappingaction.error 生成 systemexception。

sourcecolumn 属性还用于将输出或输入/输出参数的值映射回 dataset。如果它引用一个不存在的列,则会生成异常。

.net framework 数据提供程序的 parameter 类的 sourceversion 属性确定使用列值的哪个版本:original、current 还是 proposed。该功能通常用于在 update 语句的 where 子句中包含初始值,以检查开放式并发冲突。

注意 如果在更新行时出错,则会引发异常并停止执行更新。若要在遇到错误时继续更新操作而不生成异常,请在调用 update 之前将 continueupdateonerror 属性设置为 true。您还可以在 sqldataadapter 或 oledbdataadapter 的 rowupdated 事件中逐行对错误作出响应。若要在 rowupdated 事件中继续更新操作而不生成异常,请将 rowupdatedeventargs 的 status 属性设置为 continue。
上一篇:理解UDDI

下一篇:给DataGrid加上右键菜单

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表