之前有几个朋友都提到过GetChanges方法在调用的时候获取不到修改的数据或者获取到的是不对的数据,于是就和朋友一起讨论,也做了DEMO测试,
但是最后还是不了了之。当然结果是朋友换了方法,而自己也没去多在意这个方法,因为自己一直都不用他。
今天又有朋友提到这个问题,于是就花了点时间多了解了一下。当然还是自己写DEMO做测试,最后原因还是没找出来,这多少和项目本身是有点关系的。
问题没解决,但是还是总结了点东西,这里放上DEMO和一些个人见解。本人抛砖,如果引不了玉,也很欢迎各位砸砖。
通常情况下,GetChanges方法是能获取到表自上次调用AcceptChanges以来的所发生的所有更改的,包括增加、修改、删除(删除以空行表示)。
获取不到的情况估计就要根据不同的情况进行调试了,程序一个细微的操作,比如焦点变化、鼠标操作等都有可能引起相关事件的调用执行。
而这些事件都可能影响表GetChanges方法获取数据的正确性,到这里,我都是在猜测……。
下面来讲讲GetChanges方法大概的执行过程。.NET提供给我们的仅仅是GetChanges方法而已,而GetChanges到底是如何运作的,我们不知道,
因为.NET把这些操作都封装了。.NET公开给我们可供我们调用的就是我们在开发环境里可以点出来的,而执行这些可调用方法的另一些内部
(internal等,后面将会介绍)方法或者属性等等,我们只能通过调试的时候查看或者通过反编译器来查看。
首先我们可以通过反编译工具来查看GetChanges方法的执行内容,这里我用的是Reflector,因为他显示出的源代码就是我们的逻辑代码。
在发现自己对某些东西模糊不清的时候,就应该试着去搞清楚,所以后面会整理一些反编译和反汇编的东西,因为突然想起IL代码。
这里就不多说了,自己都不是很清楚的东西怕误导别人,特别是概念这东西。可以肯定的是,虽然Reflector有反汇编的功能,
但这里是反编译源代码……
因为测试的是DataTable的GetChanges方法,所以我们就首先得找到DataTable所属的DLL,
“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll”如果默认安装没有改动的话,
位置应该就是这里了。这里的测试环境是.NET 2005。到这里,觉得自己有点啰嗦,但是因为是写给新手区的,
所以就啰嗦点吧。Reflector的使用还是很简单的,这里就不做介绍了,我们只要一直点+号找到DataTable然后再
找到GetChanges然后就可以找到我们需要的东西了。最终的结果是:

public DataTable GetChanges()
{
DataTable table2;
IntPtr ptr;
Bid.ScopeEnter(out ptr, "<ds.DataTable.GetChanges|API> %d#\n", this.ObjectID);
try
{
DataTable table