ADOQuery中使用Resync解决读取lookup数据不正确的问题

在使用 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 重新定位到相应的数据行。

就完美的解决了这种“表里不一”的现象了。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ListView 是一个常见的控件,可用于显示数据ADOQuery 是 C++ Builder 用于访问数据库的组件。下面是一个简单的例子,展示了如何将 ListView 与 ADOQuery 配合使用。 首先,需要在 C++ Builder 创建一个 ListView 和一个 ADOConnection 组件。ADOConnection 组件用于连接数据库。在 ADOConnection 的属性面板设置 ConnectionString 属性,指定连接字符串,例如: ``` Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyDatabase.mdb;Persist Security Info=False ``` 然后,在 Form 的 OnCreate 事件使用以下代码连接数据库: ```cpp ADOConnection1->Connected = true; ``` 接下来,在 Form 的 OnShow 事件使用以下代码查询数据: ```cpp ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("SELECT * FROM MyTable"); ADOQuery1->Open(); ``` 最后,在 ADOQuery 的 AfterOpen 事件使用以下代码将查询结果显示在 ListView : ```cpp ListView1->Clear(); ListView1->Columns->Clear(); for (int i = 0; i < ADOQuery1->Fields->Count; i++) { TListColumn *col = ListView1->Columns->Add(); col->Caption = ADOQuery1->Fields->Fields[i]->FieldName; col->Width = 100; } while (!ADOQuery1->Eof) { TListItem *item = ListView1->Items->Add(); for (int i = 0; i < ADOQuery1->Fields->Count; i++) { item->Caption = ADOQuery1->Fields->Fields[i]->AsString; } ADOQuery1->Next(); } ``` 这里的代码将查询结果的每一行显示为 ListView 的一个 ListItem,每一列显示为 ListView 的一个 Column。这个例子仅供参考,具体实现可能需要根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值