之前有几个朋友都提到过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