ADO.NET在分离了本地与远程数据库之后,一直有一个很头疼的问题就是本地数据行的创建难以和远程数据库的自增ID同步,比如远程数据库原表中存在自增ID,现在有5行,即ID= 1、2、3、4、5 ,然后现在删除第4、5行,再次执行Insert的时候ID会自动变为6。
如果操作总是实时执行在远程数据库上,那么以上的处理不会有问题,因为ID总是自增且唯一的,
但如果情况是需要和本地DataTable绑定,那么问题就来了。
回到之前那个时间结点,我们删除了4、5行,然后本地DataTable一次性Fill远程表,会得到1、2、3行,
这没问题,
然后,本地DataTable新增一行后,它也会自增一个ID,即4,
这时候,如果和远程数据库Update,并不会报错,但是远程数据库会严格执行自增规则,将ID变为6,
至此本地DataTable就和远程数据库产生了偏差,即在本地DataTable ID=4的行,在远程MySQL数据库中ID=6,
如果UI需要再次改变这一行的内容,再Update,那就大乱套了!
下面提供一个变通方法:
即在每次执行Insert操作的时候先执行:
ALTER TABLE `table` AUTO_INCREMENT =1 (这一行命令的本意是重置自增列计数器,让表中当前最大ID值+1,而不是非连续值+1)
然后查询一次远程数据库的ID最大值,
将这个值+1后赋给本地ID,
再执行Insert,
则保证本地Datatable与远程Mysql的ID列永远是相同的。
本方法并不完美,在每次Insert前需要和远程MySQL数据库沟通一次,
从效率上不是最佳的,但却是目前我能想到的唯一的办法。
如果大家有更好的方法,欢迎赐教。
如果操作总是实时执行在远程数据库上,那么以上的处理不会有问题,因为ID总是自增且唯一的,
但如果情况是需要和本地DataTable绑定,那么问题就来了。
回到之前那个时间结点,我们删除了4、5行,然后本地DataTable一次性Fill远程表,会得到1、2、3行,
这没问题,
然后,本地DataTable新增一行后,它也会自增一个ID,即4,
这时候,如果和远程数据库Update,并不会报错,但是远程数据库会严格执行自增规则,将ID变为6,
至此本地DataTable就和远程数据库产生了偏差,即在本地DataTable ID=4的行,在远程MySQL数据库中ID=6,
如果UI需要再次改变这一行的内容,再Update,那就大乱套了!
下面提供一个变通方法:
即在每次执行Insert操作的时候先执行:
ALTER TABLE `table` AUTO_INCREMENT =1 (这一行命令的本意是重置自增列计数器,让表中当前最大ID值+1,而不是非连续值+1)
然后查询一次远程数据库的ID最大值,
将这个值+1后赋给本地ID,
再执行Insert,
则保证本地Datatable与远程Mysql的ID列永远是相同的。
本方法并不完美,在每次Insert前需要和远程MySQL数据库沟通一次,
从效率上不是最佳的,但却是目前我能想到的唯一的办法。
如果大家有更好的方法,欢迎赐教。