【问题标题】:How to fetch record count from ADO Query? [duplicate]如何从 ADO 查询中获取记录数? [复制]
【发布时间】:2012-10-19 09:08:54
【问题描述】:

可能重复:
How to see progress of query execution during handle?

我想显示一个进度条,指示从数据库中获取结果需要多长时间。

我使用TADOQuery 并以异步模式打开它。虽然查询状态是stFetching,有没有办法知道[获取的记录数/总记录数]?

【问题讨论】:

  • @RBA,它是重复的,没错,但那里的代码不应该使用Application.ProcessMessages,而且它基于与我在 Sertac 在这里编辑我的帖子之前所想的相同的错误。

标签: sql sql-server-2008 delphi delphi-2009


【解决方案1】:

OnFetchProgress 事件编写一个处理程序。来自参考:

编写一个 OnFetchProgress 事件处理程序以在期间执行特定操作 异步数据检索操作。 OnFetchProgress 事件 在数据检索期间定期触发以提供指示 它的进展。为此事件创建一个处理程序以对此作出反应 定期通知,例如为用户提供视觉 指示数据检索的进度。

请注意,将传递给OnFetchProgress 事件的MaxProgress 值是最佳猜测。来自How To Use the ADO FetchProgress and FetchComplete Events

MaxProgress 不等于实际的记录数 回来。 ADO 必须获取记录才能获得该值。 这意味着 MaxProgress 只是一个最好的猜测。 MaxProgress 通常 等于 Progress 加上 Background Fetch Size。

您可以在打开查询之前向数据库发出Select Count() ..,如 Diego 的 answer 中所述,以获取将检索的确切记录总数,但这并不总是可取的,因为它可能会导致冗余表复杂查询的扫描和相当长的执行时间。

【讨论】:

  • 我错过了查看文档!谢谢:-)
  • 这对记录总数有帮助吗?
  • @Sertac,在docs中写到,MaxProgress是操作要检索的记录总数。所以要看操作是什么我>。但是,如果 MaxProgress 表示要检索的记录总数,或者只是单个批次的记录数,我目前无法确定或验证。
  • @TLama - ".. MaxProgress 只是一个最好的猜测。MaxProgress 通常等于 Progress 加上 Background Fetch Size。" (MS support article link)
  • @Sertac,所以如果我做对了,对于进度条实现,您需要使用 SELECT COUNT(*) FROM WhatYouWantToFetch 之类的查询获取进度的最大值,然后使用 SELECT * FROM WhatYouWantToFetch 之类的内容获取这些数据并在OnFetchProgress 事件中将进度条的位置设置为传递给事件处理程序的Progress 参数的值?
【解决方案2】:

不要以为你可以预测未来:)

在加载之前,向数据库提交一个计数以了解将加载多少条记录。

在批次和每个批次上构建负载,比较批次大小 * 批次数量与记录总数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多