TClientDataset 或 TDataSetProvider (dbexpress) 所需的分配、memcpy 或其他方法

Assign, memcpy or other method required for TClientDataset or TDataSetProvider (dbexpress)

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

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

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

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

此致, 博多

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

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