DELPHI中的PacketRecords - 它在幕后的工作原理

时间:2013-11-14 17:56:13

标签: delphi tclientdataset

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

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

属性packetRecord只是感觉TClientDataSet是否没有获得数据库中的所有行,至少对我而言。

我是对的吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

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