运用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