【问题标题】:Is it possible to show the records from an ADOQuery whilst opening it?是否可以在打开 ADOQuery 时显示它的记录?
【发布时间】:2016-04-13 14:38:40
【问题描述】:

我有一个通过数据源链接到 DBGrid 的 ADOQuery。
ADOQuery 和 DataSource 位于 DataModule 中,而连接采用另一种形式。

有没有办法让我的应用程序在查询获取记录时显示行?
像 MSSQL Management Studio。

select 大约需要 7 分钟才能终止执行。

我使用的是 Delphi 2007。

【问题讨论】:

  • 查询从服务器获取多少条记录?
  • 为什么连接不在其他组件的同一个数据模块中?
  • 嗯,首先要做的是找出您的查询执行如此缓慢的原因 - 即使在慢速网络上,执行时间也不应该超过 7 分钟,甚至 7 秒。如果服务器在同一台机器上,它应该几乎是即时的。因此,我建议您至少在问题中添加查询的 Sql、用于执行查询的确切代码以及 AdoQuery 拥有的所有事件处理程序的代码。没有这些,我怀疑有人能帮助你。
  • 查询在 mssql 管理工作室中的运行速度是否一样慢?如果是这样,请向我们展示您的查询。

标签: sql-server delphi delphi-2007 tadoquery


【解决方案1】:

一个艰巨的挑战。如果我需要进行大量查询,我通常会将查询分成块。然后我创建了一个存储过程,它接受参数@ChunkNumber、@ChunkSize 和@TotalChunks。因此,您只需对从 (@ChunkNumber-1)@ChunkSize+ 1 到 @ChunkNumber@ChunkSize 的记录运行查询。在您的 Delphi 代码中,只需运行这样的循环(伪代码):

for(Chunk = 1 to TotalChunks)
{
       DataTableResults = sp_SomePrecedure @ChunkNumber = @Chunk, 
                           @ChunkSize = ChunkSize
       RenderTableToClient(DataTableResults)
}

这样,假设您有 10,000 条记录,块大小为 100。所以您将有 100 次 SP 调用。因此,您可以渲染从 SP 接收到的每个块,以便用户能够看到表的更新。

限制是如果查询运行需要首先运行所有记录。例如。分组依据。 SQL Server 使用 OFFSET,因此您可以组合起来获得有用的东西。

我有运行大约 800K 记录的查询需要大约 10 分钟才能运行,我这样做了。但我所做的是将源表分块然后运行查询,例如如果一个表用户有 1M 条记录,并且您想返回一个显示每小时访问的总页数的查询,则可以将用户分块并仅对每个块运行查询。

对不起,我没有具体的代码示例,但希望这个建议能引导你朝着积极的方向前进。

【讨论】:

  • 问题是,OP 从来没有解释为什么他的查询运行如此缓慢(7 分钟检索 2500 行)。
  • 同意,但具体的问题是如何在 DataGrid 中逐步呈现数据,而无需等待整个运行。如果 OP 问“为什么我的查询这么慢”,也许这对我们来说是一个更合适的问题:D
  • 但它是一个 Delphi q,你的回答没有解决这个问题。 Delphi ADO 查询本质上能够异步返回结果,并且在任何情况下都可以在后台线程中检索行并定期更新它们在 gui 中的显示,如果应用程序被编码为这样做的话。
  • 是的,但您没有考虑到 SQL Server 本身并不提供此功能。它会消失,运行查询,一旦完成,返回结果......所以如果 SQL Server 需要 7 分钟来响应,那么 Delphi 将不会有任何异步渲染。
  • “SQL Server 本身并不提供此功能。”真的吗?那么您如何解释OP想要模拟的SSMS行为以及本文中所说的内容:social.msdn.microsoft.com/Forums/sqlserver/en-US/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2021-01-29
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多