DELPHI中的PacketRecords-它在幕后的工作方式

DELPHI中的PacketRecords-它在幕后的工作方式,delphi,tclientdataset,Delphi,Tclientdataset,我正在研究packetRecord属性TClientDataSet,对此我有疑问。我将解释我认为这是如何工作的,如果我错了,请纠正我 1-如果我配置th packetRecord=50,当我从历史记录中选择*时,如果表历史记录有200k行,TClientDataSet将执行如下操作:从历史记录中选择*限制50,因此当我需要更多50行时,ClientDataSet将在数据库中搜索更多50行 如果TClientDataSet不能获取数据库中的所有行,至少对我来说,属性packetRecord是有意义

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

1-如果我配置th packetRecord=50,当我从历史记录中选择*时,如果表历史记录有200k行,TClientDataSet将执行如下操作:从历史记录中选择*限制50,因此当我需要更多50行时,ClientDataSet将在数据库中搜索更多50行

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


我说得对吗

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

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

因此,最终它取决于BlockReadSize的实现和所使用的TDataSet的dsBlockRead状态

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


因此,正如我上面所说,没有关于如何工作的一般规则,即使这些属性有任何影响。

请参阅TDataPacketWriter.writedasaset。无论底层数据集是否支持块读取模式,只要请求的记录量或Eof状态达到,datapacket writer就会停止写入数据包

有用的信息,但我需要更准确的信息,我正在对此进行研究,以提高系统的性能。也许您的DBMS会记录查询?这可能会告诉您它是执行一个查询,还是确实增加了一个限制。正如我所想,ClientDataSet除了将该属性传递给提供者之外,对该属性不做任何处理,提供者基本上将该属性传递给数据集(如果有)。最后,它取决于BlockReadSize的实现和所使用的TDataSet的dsBlockRead状态。将此信息添加到答案中。