急于交货,但还有一个ADO错误没解决,请各位高手救命(100分)

  • 主题发起人 主题发起人 joeywong
  • 开始时间 开始时间
J

joeywong

Unregistered / Unconfirmed
GUEST, unregistred user!
我的开发环境是ADO+Access 2000,已安装了Delphi的所有Update Pack.

当我在DBGrid输入数据时经常有以下错误信息出现:
“无法为更新行集定位;一些值可能已在最后读取后改变。”

我测过一下,估计是在以下情况出现的:
插入一条记录,填入所有数据,移动指针,然后再回到
刚才插入的记录,修改记录,错误就出现了。

以上情况好像在BDE没有出现,而且我发现无论是否使用Batch模式,
问题都依然存在。依我所知,在DBGrid中,当指针移动时,数据库
是自动Post的,既然Post了,应该就没有问题啊。想了一个多星期
了也不明白。


急于交货,请各位高手救命!!!!!!!!!!!!!!!!!!!!!!!!!!
 
你在修改记录前先显示的调用post方法呢?
或者更毒一点,先close,再open
 
我的程序现在是用Batch模式的,如果这样做不太好吧。
 
你的问题和如下操作产生的错误是一样的比如先在你的程序中修改一条纪录先别提交。然后在
ACCESS 中将刚才纪录的关键字值改变并存盘,此时回到你的程序去提交。产生的错误是一样的。
错误产生的原因是两个操作同时去操作一条纪录先锁定的后提交结果提交时发现该记录已经不是
锁定的记录了(关键字或纪录中某一部分值已经改变)。
 
ONPOSTERROR 可以捕获该错误
 
在POST后Refresh
 
我遇到过,但不是采用batch方式,当时因为没有主关键字才出现这个问题
你应该从这方如手
 
to joeywong:
如果你的程序是单机版的建议不要使用batch 模式。
如果是c/s 版,考虑数据流量的问题,可以使用batch 模式,当两个用户同时修改
同一条记录时,该错误不能避免,只能想办法捕捉该错误并进行正确处理。建议你查一
查李维的《delphi 5.x ado /mts /com+高级程序设计篇》,里面有一节对该问题有专门
介绍(第三章处理错误)
 
首先在表中加关键字段,这个很重要!
另外你可以跟踪数据集的状态,一定可以查出错误!
 
修改完毕后马上执行Requery方法就可以了
 
别忘了ApplyUpdate(-1)
 
将LockType
改为:ltBatchOptimistic
在窗口退出时
UpdateBatch();
ok了
 
感谢以上各位的热情帮忙!
经过一段时间的测试,终于有了点成绩。
以下是我的一点点经验,不知对否,供大家参考

产生这种错误有多种原因:

1. 正常情况下,一般理解,第一种原因是zzh0918兄提到的。
但我的情况不是,因为我调试时只有一个用户,所以这种原因可以忽略。

2. 第二种原因是江维兄提到的,这种毛病我以前编程时也犯过,不过
现在所有的表我都已经加上了主键,所以这种原因也可以忽略。

3. 第三种原因是我从以前的贴子看到的,有朋友提到,这可能是Delphi的
Bug,解决的方法的在OnNewRecord时对所有浮点类型的字段先赋零值。
我试过这种办法,发现在一些Query可以,但同样的做法在另外一些Query
就不行,Table就完全不行。想了好久都想不通。

最后我选择了鹤舞白沙兄的方法,这种方法是慢了点,但也实属无夸。


还有的就是,我发现如果要想采用Master/Detail的方式,最好还是用
ADOQuery,ADOTable有很多问题是挺难解决的。
 
后退
顶部