在使用 Delphi2007 的ADOQuery时,遇到一个看到的数据与读取 lookup 数据不一样的问题。
使用 MSSQL数据。有一个存储过程。使用ADOQuery(QTY1)获取返回的数据。
如:
ID NAME MACHINE QTY
1 JOE XL75 200
2 ZUE GTO 100
在 ADOQuery的fields 属性中,增加两个lookup字段 L_NAME ,L_QTY ,LOOKUP数据集 QTY_LOOK 到QTY1中
结果如下:
ID NAME MACHINE QTY L_NAME L_QTY
1 JOE XL75 200 AAA 205
2 ZUE GTO 100 BBB 200
好了,此时我们修改 QTY_LOOK 中的第一行数据 将 AAA 修改为 A01 ,205 修改为 300
数据表也正常显示为:
ID NAME MACHINE QTY L_NAME L_QTY
1 JOE XL75 200 A01 300
2 ZUE GTO 100 BBB 200
到目前为止一切正常;
表面上看到的貌似一切正常,但是在读取数据时就出现了“表里不一”的问题;
当你:
QTY1.FieldByName('L_NAME').AsString 读取数据时,你得到的结果并非你眼睛看到的 A01 ,而是旧的数据 AAA 。
此时虽然可以刷新(相当于重新统计QRY1)的数据,但是这要重新在后台执行那个存储过程来”重置“QRY1的数据是可以解决这个问题。
但是这样做显而易见的不科学;
由于QRY1只是显示一个统计结果,所以并不能保存数据。
那么保存自然就会出错,虽然出错,但是在出错之后,再次读取数据时却能读取到你眼睛看到的并且你想得到的数据;所以分析一下保存数据虽然出错但能解决表里不一的原因;
后来通过分析发现,只要在修改 QTY_LOOK后,QRY1再执行一下:QRY1.Resync([]); 就可以解决问题了。
但仍然不完美,使用 Resync 会遍历QRY1 的每一行数据,最终会定位到最后一行数据。此时如果再加上 bookemark 功能 或 Local 重新定位到相应的数据行。
就完美的解决了这种“表里不一”的现象了。