【发布时间】:2020-05-26 16:04:05
【问题描述】:
我有一个程序必须在用户转到数据集中的某个记录后设置一个不太复杂的屏幕 (TUniQuery)。用户可以通过多种方式跳转:组合框、搜索框,最后是 DbNavigator。从第一个记录到最后一个记录需要很长时间。在执行程序后,我发现按下 DBNavigator 上的最后一个按钮会导致数据集上的每条记录都被访问,因此,在每条记录上,屏幕都是无用的。从任何记录到第一个或最后一个记录都是一样的。我的理解是,这样的方法(First 和 Last)会直接跳转。也许是 Unidac 组件上的一种特殊行为,但我找不到任何参考或属性来修改它。目前,我计划在 BeforeScroll 事件上设置一个标志,但由于 AfterScroll 也发生在每个事件之后,我无法知道数据集何时结束滚动。我在 Delphi 文档中也找不到任何简单说明
调用 Last 以激活数据集中的最后一条记录的参考
【问题讨论】:
-
它是多用户应用吗?检索太多行(听起来您可能是这样)是对用户不利的事情。
-
查询和数据库经常决定你是否可以这样跳。尝试使用 TUniTable 或者如果您必须使用 TUniQuery 使查询变得简单并定义关键字段等。
-
如果查询结果集中的行数多于行缓冲区中的行数,则不能直接跳转。到达缓冲区末尾后,向服务器请求另一组行,然后处理直到到达缓冲区末尾,此时该过程一次又一次地重复,直到到达最后一行。您通常通过使用特定的 SELECT 列列表而不是
SELECT *来限制要检索的列数并使用WHERE限制行数来限制它们来处理此问题。 -
您可以通过在调用
First或Last之前禁用前后滚动事件来解决此问题,然后在之后恢复它们(在finally块中)。跨度> -
不可能,肯。 First 和 Last 由 TDBNavigator 调用。在这种情况下,行数很少,并且可以直接跳转,因为已获取所有记录(特别是四个)