简述DbDataAdapter.Update 方法

简述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。

时间: 2024-12-22 16:58:32

简述DbDataAdapter.Update 方法的相关文章

简述DbDataAdapter.Update 方法(续)

附 DbDataAdapter.Update方法的所有重载版本 n Overloads Public Function Update(ByVal dataRows() As DataRow) As Integer n Overrides Overloads Public Function Update(ByVal dataSet As DataSet) As Integer Implements IDataAdapter.Update n Overloads Public Function Up

自己动手写ASP.NET ORM框架(八):实现修改功能Update方法

前面一节中已经实现了简单的新增功能,下面来实现修改功能,代码如下1-1: #region 将实体数据修改到数据库 public int Update<T>(T entity) { TableInfo tableInfo = DbEntityUtils.GetTableInfo (entity,DbOperateType.UPDATE); string strSql = DbEntityUtils.GetUpdateSql(tableInfo); IDbDataParameter[] parms

Cocos2d-swift V3.x 中的update方法

在cocos2d V3.x中update方法如果实现,则会被自动调用;不用向早期的版本那样要显式schedule. 但是你还是要显式schedule其他方法或blocks使用node的schedule和unschedule方法.比如:scheduleOnce. update方法会在每一帧将对象(node)渲染到屏幕之前调用. 值得注意的是,你绝不能在cocos2d中的schedule时间事件中使用NSTimer,任何performSelector的变体方法以及Grand Central Disp

java gui-关于javaGUI组件update()方法

问题描述 关于javaGUI组件update()方法 java问题:都说java swing组件中repaint()调用update(),update()调用paint(),我在继承自JFrame类里重写了update(),api里说重写update()应该在里面调用super.update()或直接在里面调用paint(),但我没有这样做,为什么在执行程序的时候却还是调用了paint()呢?求大神详细解答下 解决方案 update()可能引起重绘,也可能不引起.如果引发重绘,就会调用paint

java 里面重写update方法,paint

问题描述 java 里面重写update方法,paint 如题 java 里面重写update方法,重写的update里面没有调用paint方法,系统还会调用paint方法吗

update方法-Java 窗口缩放时使窗口内容也相应缩放

问题描述 Java 窗口缩放时使窗口内容也相应缩放 程序需要实现的就是缩放窗口时调用update方法使窗口内容也随之缩放,其他都能执行,所以我代码也没放上来,就是update里面的addEntry()没办法执行,为什么呢?我把entry和color都创建实例变量了啊,我也有试过把addEntry里面的方法放到update里面,然后直接addentry里调用update方法也不行...本人小白,求大神赐教! ![

使用sqlDataAdapter类的update方法更新数据库的问题

问题描述 使用sqlDataAdapter的update方法更新数据库时,比如使用DataTable作为update方法的参数,page_load时select了一些数据在DataTable中并作为数据源绑定在页面了,然后在页面编辑了数据,最后使用update方法,将修改发送到数据库.问题是DataTable中的数据怎么保持的阿? 解决方案 解决方案二:web的话可以临时保存在session中win的话不存在这个问题解决方案三:我一般用ViewState解决方案四:回发后重新绑定吧?解决方案五:

java-hibernate框架,测试update方法时报空指针

问题描述 hibernate框架,测试update方法时报空指针 上面提示33行,33行也就一个字段一个方法,两个都找得到的 解决方案 可能是传进去的参数 或是执行的HQL语句问题,没有把数据插入. 空指针的情况很多哦! 解决方案二: user可能是空,,查一下数据库,是不是id为1的那个被删除了

hibernateTemplate.update() 方法 控制台已输出SQL语句,但数据库没有更新

问题描述 运用Spring集成Hibernate使用hibernateTemplate.update()执行修改用户操作SQL语句控制台已经输出,对象参数也正确,控制台也没有输出事务回滚但数据库数据没有更新卡了一上午了,在网上查了相关问题没有找到合适答案,所以来CSDN求教求大神解答... 解决方案 解决方案二:@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)publicvoidupdateS