我们有一个TDBGrid,它通过Delphi7中的TDataSetProvider与Oracle数据库连接到TClientDataSet。
显示小表的内容很好,但是当您尝试打开一个包含许多行的表时,程序会挂起(比如200万行),因为TClientDataSet试图在内存中加载整个表。
我试图将"FetchOnDemand“设置为TClientDataSet的True,而将"poFetchDetailsOnDemand”设置为TDataSetProvider的True,但这无助于解决问题。有爱迪生吗?
更新:
我的解决办法是:
TClientDataSet.FetchOnDemand = T
TDataSetProvider.Options.poFetchDetailsOnDemand = T
TClientDataSet.PacketRecords = 500通过为PacketRecords设置“TCustomClientDataSet”属性,我成功地解决了这个问题。此属性指示单个数据包中记录的数量或类型。PacketRecords自动设置为-1,这意味着单个数据包应该包含数据集中的所有记录,但我将其更改为500行。
发布于 2014-02-07 10:25:37
当使用RDBMS,特别是大型数据集时,尝试访问整个表正是您不应该做的事情。这是一个典型的新手错误,或者借用了基于旧文件的小型数据库引擎。在使用RDBMS时,您应该只加载您感兴趣的行,显示/修改/更新/插入,并将更改发送回数据库。这意味着在没有OREDER的情况下发出SELECT时,带有专用WHERE子句的SELECT和ORDER记住行排序永远不会得到保证,数据库引擎可以按照它认为适合于给定查询的顺序来检索行。如果必须执行批量更改,则需要在SQL中执行这些更改,并在服务器上对其进行处理,而不是加载整个表客户端、修改它并将更改逐行发送到数据库。加载大型数据集客户端可能出于以下几个原因:内存不足(特别是32位应用程序)、内存碎片等等,您可能会将不需要的数据淹没在网络中,迫使数据库执行完全扫描,可能也会击穿数据库缓存,等等。因此,客户端数据集的设计并不能处理数百万行。它们设计为缓存需要客户端的行,然后将更改应用于远程数据。您需要更改应用程序逻辑。
https://stackoverflow.com/questions/21605765
复制相似问题