Delphi性能:读取数据集中字段下的所有值

前端之家收集整理的这篇文章主要介绍了Delphi性能:读取数据集中字段下的所有值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们试图从TADOQuery中找到一些性能修复.目前,我们使用’while not Q.eof do begin … Q.next方法循环记录.对于每个记录,我们读取每个记录的ID和值,并将每个记录添加到组合框列表中.

有没有办法将指定字段的所有值一次性转换为列表?而不是循环数据集?如果我可以做一些像……那样的话真的很方便

TStrings(MyList).Assign(Q.ValuesOfField['Val']);

我知道这不是一个真正的命令,但那是我正在寻找的概念.寻找快速响应和解决方案(一如既往,但这是为了解决一个非常紧急的性能问题).

解决方法

其他人提出了一些很好的性能建议,你应该在Delphi中实现.你应该考虑他们.我将专注于ADO.

您还没有指定后端数据库服务器是什么,所以我不能太具体,但是您应该了解一些关于ADO的事情.

ADO RecordSet

在ADO中,有一个RecordSet对象.在这种情况下,RecordSet对象基本上就是您的ResultSet.迭代RecordSet的有趣之处在于它仍然与提供者耦合.

光标类型

如果您的游标类型是Dynamic或Delphi的默认Keyset,则每次RecordSet从提供程序请求新行时,提供程序将在返回记录之前检查是否有任何更改.

因此,对于TADOQuery,你所做的只是读取结果集以填充组合框,并且它不太可能已经改变,你应该使用静态游标类型来避免检查更新的记录.

如果你不知道光标是什么,当你调用像Next这样的函数时,你正在移动代表当前记录的光标.

并非每个提供程序都支持所有游标类型.

的CacheSize

Delphi和ADO的RecordSet默认缓存大小为1.这是1条记录.这与光标类型结合使用. cachesize告诉RecordSet一次获取和存储多少条记录.

当您发出一个高速缓存大小为1的Next(在ADO中真的是MoveNext)之类的命令时,RecordSet只在内存中有当前记录,因此当它获取下一条记录时,它必须再次从提供程序请求它.如果光标不是静态的,则可以使提供程序在返回下一条记录之前获取最新数据.因此,大小为1对于Keyset或Dynamic是有意义的,因为您希望提供程序能够获取更新的数据.

显然,值为1时,每次移动光标时,提供者和RecordSet之间都会进行通信.好吧,如果游标类型是静态的,那就是我们不想要的开销.因此,增加缓存大小将减少RecordSet和提供程序之间的往返次数.这也会增加你的内存需求,但它应该更快.

另请注意,如果Keyset游标的缓存大小大于1,如果所需的记录位于缓存中,则它不会再次从提供程序请求它,这意味着您将看不到更新.

猜你在找的Delphi相关文章