1

好吧,我正在研究“packetRecord”属性(TClientDataSet),我对此有疑问。我将解释我认为这是如何工作的,如果我错了,请纠正我。

1 - 如果我配置 th packetRecord = 50,当我执行“SELECT * FROM history”时,如果表历史记录有 200k 行,TClientDataSet 将执行以下操作:“SELECT * FROM history limit 50”,所以当我需要更多50 行 ClientDataSet 将在数据库中搜索更多 50。

如果 TClientDataSet 没有获取数据库中的所有行,至少对我来说,属性 packetRecord 才有意义。

我对么 ?

4

2 回答 2

0

请参阅 TDataPacketWriter.WriteDataSet。无论底层数据集是否支持块读取模式,它(数据包写入器)都会在处理请求的记录量(或达到 Eof 状态)后立即停止写入数据包

于 2013-11-15T04:52:42.200 回答
0

它可能会执行整个查询并要求仅返回 50 条记录,但我认为这不是由 ClientDataSet 选择的实现细节,而是由提供者、数据集或驱动程序选择的。但总的来说,它或多或少是这样工作的,是的。

浏览了一些代码。如果 ClientDataSet 链接到(本地)TDataSetProvider,则该提供者只会打开它所连接的数据集。打开后,它将 DataSet.BlockReadSize 属性设置为要检索的记录数 (=packetRecords)。

所以最后归结为 BlockReadSize 的实现和使用的 TDataSet 的 dsBlockRead 状态。

对于客户端-服务器设置,这必须是同一件事。事实上,甚至不必有数据集甚至数据库。还有一个 TXMLTransformProvider,人们也可以实现自定义提供程序。TXMLTransformProvider 完全忽略这个值。

所以,就像我上面所说的,没有关于它如何工作的一般规则,即使这个属性有任何影响。

于 2013-11-14T18:15:47.870 回答