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
我在 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