关于SqlDataAdapter的Update(dataTable)方法

运用SqlDataAdapter的Update()方法可以很方便的将对一张数据表进行的大量修改批量更新的数据库中,但是这个函数的批量更新到底是怎么实现的,有什么需要注意的地方,我仅以我自己的理解,以及一些试验结果,在这篇文章里叙述一下我自己的学习心得,希望对大家有所帮助。

首先,我们需要定义一个SqlDataAdapter:

SqlDataAdapter thisAdapter = new SqlDataAdapter(strQuery, conn);

StrQuery是查询语句,conn是一个SqlConnection,然后定义一个SqlCommandBuilder:

SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);

这个SqlCommandBuilder用来自动生成添加、删除、修改的语句,注意这个参数是刚才建立的SqlDataAdapter。当上述工作完成之后,我们调用SqlDataAdapter的Fill()方法,将查询出来的数据表内容填充的一张DataTable里面:

thisAdapter.Fill(ds, "TableName");

ds是一个DataSet,TableName可以自己写,一会Update()函数用的上。之后,对这张DataTable进行一些添加、删除、修改操作,然后调用Update()方法,将这些对DataTable进行的更改批量更新到数据库对应的表中:

thisAdapter.Update(ds, "TableName");

这样,我们就完成了对数据库的批量更新,这个方法还是很方便的,当然,Update()方法还有其他一些重载方法,只是参数不同。

其次,在使用这个函数前,我们得知道一点,那就是一个DataTable有个记录RowState的字段(不知称其为字段合适不合适),当我们对表进行过添加、修改、删除之后,这个RowState会记录我们的操作,而Update()方法正是根据RowState进行对数据库表的更新的。但有点需要注意,那就是添加和删除操作:当我们使用Add()方法添加一个新行和Delete()方法删除一行的时候是没有问题的,DataTable都正确记录下来了我们的操作,并能在Update()函数下正确更新到数据库中,但是当我们使用Import()方法导入一行或Remove()删除一行的时候,我们此时再使用Update()方法,发现我们的添加和删除没有成功,这是为什么呢?我们分别来看一下:Import()方法,我们导入的是一个已经存在于其他表里的行,而这个被导入的行的RowState记录的是什么是不确定的,所以导入到我们的DataTable中的时候,我们的DataTable并不一定把这一行当作是添加的行;Remove()方法,其实,在我们使用Delete()方法的时候,我们的DataTable并没有真正的把这一行删除了,而只是记录了一个删除状态,当我们使用DataTable的AcceptChanges()的时候,记录为删除状态的行才被真正删除了,而Remove()方法是直接把行删除了,所以再使用Update()方法时没有实现对数据库对应表的行删除功能。

当我们完成了Update()函数之后应该调用DataTable()的AcceptChanges()方法,把DataTable的RowState记录初始化。用进行过RowState初始化(即调用过AcceptChanges ())的DataTable去Update()数据库中的表,将不会进行任何更新。

我在项目里用这个Update()方法的时候是这么用的:我并不是从数据库中先读出一张DataTable,进行一些添加或删除或修改,然后Update(),而是我有一张现成的dataTable,我最初的想法是想让我的这张DataTable和数据库中对应的表进行对比,然后根据两张表的不同之处进行更新,但实际上这是无法实现的,是我最初没有真正明白Update()函数的原理。所以,SqlDataAdapter的Update()方法不是拿数据库中的表和程序中的一个DataTable进行对比更新,而是根据程序中的DataTable中记录的RowState进行更新。

所以,我们想要使用这个Update()方法实现批量更新,必须让我们的DataTable正确记录所有的RowState,当更新完成后还应调用AcceptChanges()方法对DataTable的RowState进行初始化。

http://blog.sina.com.cn/s/blog_4dde37650100g8fe.html

原文地址:https://www.cnblogs.com/liuslayer/p/11110374.html

时间: 2024-11-13 09:45:52

关于SqlDataAdapter的Update(dataTable)方法的相关文章

自定义DataTable方法

//创建DataTable                    DataTable dt = new DataTable();                    dt.Columns.Add("EMP_NO", Type.GetType("System.String"));                    dt.Columns.Add("BANK_NO", Type.GetType("System.String")

hibernate save,update,saveorupdate方法有什么区别

save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用的时候 不会出现索引机制(即遍历目录 效率最高)update在修改时候要遍历 不存在则会异常saveorupdate是优先遍历 如果不存在则创建(效率最低)merge和saveOrUpdate方法区别在于:merge方法是把我们提供的对象转变为托管状态的对象:而saveOrUpdate则是把我们提供

Golang 中操作 Mongo Update 的方法

Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更多 个人分类: MongoDBGolang 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010649766/article/details/79385948 MongoDB 中有一种时间格式数据 ISODate,参考如下:  如果在 Golan

ESXI5.5 升级至 ESXI5.5 Update 1方法

从ESXi 5.5升级到ESXi 5.5 U1 使用esxcli就可以做到了,仅限于小版本的升级.如果跨大版本升级的话,请使用Update management进行升级或者重新安装ESXi5.5 U1. 操作步骤如下: 1.从VMware官网下载对应的zip升级补丁包,补丁下载地址: https://www.vmware.com/patchmgr/findPatch.portal 2.通过FTP工具上传升级补丁包至ESXi存储上: 3.将ESXi主机进入维护模式,最好将虚拟机迁移到其它主机上,以

mybatis执行批量更新batch update 的方法

1.数据库连接必须配置:&allowMultiQueries=true 我的配置如下:jdbc:mysql://10.20.13.16:3306/CALENDAR?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true 2.批量修改并加判断条件(修改字段可选) <!-- 批量更新赛程 --> <update id="updateMatchs" parameterType=&q

Update修改方法判断该ID的数据是否超过24小时,超过不许修改

@PostMapping("/update") public Result projectUpdate(@RequestBody ProjectVoEntity projectvo) throws ParseException { //获取项目id ProjectEntity project = projectService.selectById(projectvo.getProjectid()); //获取项目分类id ClassesEntity ce = classesServic

DataAdapter.update更新无任何反应的原因

public bool UpdateTable(DataTable srcTable, string tableName)        {            bool isok = false;            try            {                foreach (DataRow myRow in srcTable.Rows)                {                    foreach (DataColumn myColumn 

.net批量更新(插入、修改、删除)数据库

思路: 1. 设置DataTable中每行的状态标识,即调用DataRow的方法setAdded().setModified().Delete() 2. 使用DataAdapter的Update(DataTable)方法 代码例子: String connString = "........"; //连接字符串 String selectCommand = "select * from item"; SqlDataAdapter da = new SqlDataAd

批量插入数据, 将DataTable里的数据批量写入数据库的方法

大量数据导入操作, 也就是直接将DataTable里的内容写入到数据库 通用方法: 拼接Insert语句, 好土鳖 1. MS Sql Server:   使用SqlBulkCopy 2. MySql: adapter.update()批量更新 MySqlBulkLoader, 这个是从文件里边到的, 有个实现是先将DATATable编程CSV文件, 在用MySqlBulkLoader导入MySql 参考文章: http://theonetechnologies.com/outsourcing/