【发布时间】: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,正如我所说,我从未尝试过,目前我不能。那么,您提到的
CursorType和CacheSize如何影响获取?PacketRecords也会影响它吗?我不是在谈论为什么要获取这么多数据的理论,假设我必须以增量方式获取它们以获得一些响应。我想知道我应该为这个自动增量获取设置什么。一些代码示例将是最好的;)