有没有办法将指定字段的所有值一次性转换为列表?而不是循环数据集?如果我可以做一些像……那样的话真的很方便
TStrings(MyList).Assign(Q.ValuesOfField['Val']);
我知道这不是一个真正的命令,但那是我正在寻找的概念.寻找快速响应和解决方案(一如既往,但这是为了解决一个非常紧急的性能问题).
解决方法
您还没有指定后端数据库服务器是什么,所以我不能太具体,但是您应该了解一些关于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,如果所需的记录位于缓存中,则它不会再次从提供程序请求它,这意味着您将看不到更新.