【问题标题】:DBGrid with read ahead capability using ADO使用 ADO 具有预读功能的 DBGrid
【发布时间】:2011-12-17 19:20:00
【问题描述】:

我正在使用 ADO 连接到 SQL Server 2005。

我的 TADODataSet 选择了 100 万条记录。使用 TDBGrid 并将 TADODataSet.CursorLocation 设置为 clUseServer 有效。但是 TDBGrid 窒息了!

如何选择 100 万条记录,避免分页,并且仍然能够在网格中显示记录,而无需将所有记录提取到客户端,让网格在我上下滚动时提前读取?

SQL 企业管理器可以毫无问题地异步执行查询并选择 100 万条记录(也是 MS-ACCESS)。

【问题讨论】:

  • 您是否尝试过在两者之间放置一个 ClientDataset?它最终仍会获取所有记录,但一旦加载了批次,它的浏览速度可能会更快。
  • 我不想将 100 万条记录提取到客户端。 ClientDataset 将做到这一点。
  • 看来TClientDataSet.PacketRecords 听起来对你很有希望。我从未尝试过,现在无法验证,但似乎如果您将其设置为可见的 DB 网格行数并在 TClientDataSet.BeforeGetRecords 事件中获取数据,那么您将得到您想要的。另一件事是您必须自己处理滚动(因为 DB 网格不知道总行数)并且您必须手动获取数据。
  • @TLama:在 TDBGrid 中使用增量获取不需要手动获取数据。网格不知道记录的总数(它发生在任何不一次获取整个数据集的数据集上)然后只会在中间显示滚动条 - 当网格到达最后一个获取的记录时,数据集将自动获取另一组数据包,除非另有设置,网格将继续工作,即滚动条将重置以告诉用户数据集不是 EOF 也不是 BOF。
  • @Idsandon,正如我所说,我从未尝试过,目前我不能。那么,您提到的CursorTypeCacheSize 如何影响获取? PacketRecords 也会影响它吗?我不是在谈论为什么要获取这么多数据的理论,假设我必须以增量方式获取它们以获得一些响应。我想知道我应该为这个自动增量获取设置什么。一些代码示例将是最好的;)

标签: delphi ado dbgrid


【解决方案1】:

TGrid 不是你的问题。您的问题是 TADODataset 正在尝试加载所有记录。如果必须运行返回这么多记录的查询,则应设置 ExecuteOptions,尝试 eoAsyncExecute 和 eoAsyncFetch。设置 CacheSize 也可能会有所帮助。

【讨论】:

    【解决方案2】:
    • 为什么需要将 1M 条记录提取到网格中?没有人能看这么多的记录。通常在将记录加载到 UI 之前减少记录数量要好得多。
    • 如果您有充分的理由在网格中显示这么多记录,您需要一个 1) 在打开时不会加载整个记录集的数据集2) 不缓存以前的记录,或者如果记录大小不够小,它可能会在到达记录集末尾之前内存不足(尤其是在 32 位 Windows 下)。要在 CursorLocation 之外获得这样的结果,您必须正确设置 CursorType 和 CacheSize。
    • 您可以使用 TClientDataset 来实现增量获取,将 ADO 数据集 CursorType 设置为 ForwardOnly 并将 CacheSize 设置为合适的值。因为 TClientDataset 缓存读取记录,所以您希望避免源数据集也加载所有这些记录。标准 DB 网格需要一个双向光标,因此它不适用于单向光标。有这么多记录,客户端数据集缓存无论如何都会耗尽内存。如果您使用的是 2010 年之前的 Delphi 版本,我建议您使用 Midas Speed Fix unit
    • 为避免“内存不足”错误,您可能需要实现某种分页。无论如何,请检查其他 CursorType 的行为是否可以帮助您。

    【讨论】:

      【解决方案3】:

      你可以试试AnyDAC 和 TADTable。它的Live Data Window 模式可以解决您和类似的问题。好处是:

      • 最大限度地减少内存使用并允许处理大量数据,类似于单向数据集;
      • 与单向数据集相比,启用双向导航;
      • 始终提供最新数据,减少刷新数据集的需要;
      • 不会延迟获取所有结果集记录,需要执行排序、记录定位、跳转到最后一条记录等。

      【讨论】:

        猜你喜欢
        • 2011-12-08
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2016-11-19
        • 2020-07-20
        相关资源
        最近更新 更多