3

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

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

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

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

4

3 回答 3

1

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

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

你可以试试AnyDAC和 TADTable。它的实时数据窗口模式解决了您和类似的问题。好处是:

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