昨晚Debug倒凌晨三点,为的是一个+1错误。也就是出来的结果比预想中的结果多一或者少一了。
为了这个Bug苦苦挣扎了4个小时,因为它不是每次都发生,经过反复的试验,发现在操作DataSet的时候只有删除一行的时候,才会出现这个+1错误。于是开始单步跟踪,查看内存中的数据,聚精会神一个半小时,没有发现任何错误,数据完全和想象中的一样,可为什么写到数据库中的时候数据就变掉了?难道SqlDataAdapter有bug?
在没有确认之前,我还是认定这个Bug是自己的。经过仔细观察,确实在最后一步写入数据库的时候出现了问题,明明是 32 写到数据库中变成了 31 …
无语了我……
仔细一想我这个字段是AutoIncrement的,莫非是这个问题?
经过反复摸索终于发现了问题所在,哈哈!很多问题真是说穿了就这样,但是在说穿之前……唉!
从数据库表中读入数据填入DataSet,表取名“Columns”。此时内存中的“Columns”和数据库中的“Columns”完全一样,包括Id字段的AutoIcrement属性。此时Id字段的最大值是30,自增种子是31。
现在操作内存中的“Columns”。插入两行,删除前面那行。此时内存中的“Columns”的Id字段的最大值应该是32,子增种子是33(Id为31的那行被删去)。但是这些操作物理数据库中的“Columns”并不知道。
现在调用SqlDataAdapter的Update方法。在写入数据库中的时候子增字段是忽略传入数据的,它的值完全根据自增种子确定。所以写入数据库的时候虽然传入32但由于物理数据库中的“Columns”中Id字段的子增种子是31所以忽略传入的32,所以32就莫名其妙的变成了31。
找到了问题所在,那解决起来当然也是方便的。只是第一次遇到这种问题,感觉谁遇到这样的问题都会郁闷的。这个问题有点价值,所以记录下来。给还没有遇到这个问题的同行提个醒:)
Debug 就和追美女一样,过程是痛苦的,结局是幸福的。