2011-05-11 66 views
1

我使用的是从基于文件的数据存储切换到基于数据库的应用程序。它有大量专门写入基于文件系统的代码。为了使交换机实现与旧系统一样的功能,计划将在新代码中更好地使用数据库。数据集检索另一个数据集的数据

一个问题是基于文件的系统经常读取单个记录,并重复读取它们以进行报告。这已经成为很多对数据库的查询,这很慢。

我一直试图充实的想法是使用两个数据集。一个数据集用于检索整个表格,另一个数据集用于查询第一个数据集合,从而减少与数据库服务器之间的通信开销。

我试着去看TADODataSetDataSource属性,但是数据集似乎仍然需要连接,如果Connection被分配,它会直接询问数据库。

我宁愿在另一个数据集中得到结果,而不是导航第一个数据集的原因是,已经实现了大量用于模拟旧系统的逻辑。该逻辑基于具有仅包含用旧界面查询的结果的数据集。

该功能只需要支持读取数据,而不是写回数据。

如何使用一个数据集来提供另一个数据集的值以供选择?

我使用的是Delphi 2007和MSSQL。

+0

TADODataSet的DataSource属性的用途是允许Data Aware控件连接到TDataSet,而不必知道使用了哪种TDataSet后代。要链接数据集,您可以使用MasterSource和MasterFields属性。但是,即使在主控和细节之间的1-1也不允许您使用“从TDataSet1中选择”作为其他数据集的选择。 – 2011-05-11 11:09:33

+0

@Marjan我虽然TADODataSet的DataSource属性是让TADODataSet成为Data Aware组件。 VCL参考文献说:“表示为数据集提供值的另一个数据集的数据源。” – MGH 2011-05-11 11:28:20

+1

你是对的。我纯粹以“DataSource”为名进行回复。数据感知控件的数据源是将其连接到其数据集的数据源。但是数据集的数据源确实是一个完全不同的野兽。我查看了TClientDataSet,显然这是唯一具有MasterSource的数据集。其他的TDataSet后代确实有一个DataSource,这似乎是MasterSource用于TClientDataSet的东西,因为TADODataSet/TSQLDataSet没有MasterSource但有MasterFields属性。 – 2011-05-11 11:43:09

回答

1

您可以使用ClientDataSet/DataSetProvider对从现有DataSet中获取数据。您可以在源数据集上使用过滤器,在ClientDataSet和提供者事件上过滤以仅将数据集修剪为有趣的记录。

我已经在一些迁移项目中成功地使用了这种技术,并且缓解了老式SQL Server 7数据库被查询数千次以检索带有痛苦性能成本的单独记录的类似情况。只查询它一次,然后将单个记录提取到客户端数据集当时不仅是一个优雅的解决方案,而且对该特定应用程序有很大的性能提升:最好的例子是将8小时的过程减少到15分钟。当时那些可怜的用户爱我。

ClientDataSet只是一个TDataSet,您可以无缝集成到现有的代码和UI中。

相关问题