0

我在 Embarcadero C++Builder XE 环境中使用 dbExpress 组件。我有一个相对较大的表,其中包含 20k 到 100k 条记录,我将其显示在 DBGrid 中。我正在使用连接到 SQLQuery 的 DataSetProvider 和连接到 DataSetProvider 的 ClientDataSet。

我还需要分析数据,因此我需要遍历整个表。对于较小的表,我总是使用代码,基本上是这样的:

    Form1->ClientDataSet1->First();
    while(!Form1->ClientDataSet1->Eof){
        temp=Form1->ClientDataSet1->FieldByName("FailReason")->AsLargeInt;
       //do something with temp
       Form1->ClientDataSet1->Next();
       }

当然这可行,但是当我需要运行整个 DBGrid 时,它非常慢。对于大约 50000 条记录,可能需要几分钟时间。我的怀疑是,由于 DBGrid 需要重新绘制,因为实际的 Dataset 增加了它的地址,所以大部分性能都丢失了。因此,我正在寻找一种方法,它允许我在不操作实际 ClientDataSet 的情况下读取数据。也许是一种将列的数据复制到变量中的方法,或者是另一种更有效的遍历数据集的方法。我敢肯定,如果我在变量中有一个副本,那么操作将花费不到几秒钟的时间......我现在用谷歌搜索了几个小时,但到目前为止没有发现任何有用的东西。

最好的问候, 博多

4

1 回答 1

0

如果您的 cds 连接到某些 db-aware control(-s)(通过 TDataSource),那么首先考虑使用 DisableControls()

另一种选择是避免在循环中使用 FieldByName

于 2018-02-19T08:21:06.517 回答