3

我是德尔福的新手。我有两个 TSQLTables(比如 A 和 B)通过两个 TDataSetProviders 链接到两个 TClientDataSets(分别是 cdsA 和 cdsB),两个 DataSources(dsA 和 dsB)完成了这个场景。

设A为主,B为细部。

B.MasterSource 设置为 dsA 值,B.MasterFields 值引用 cdsA 中不存在的字段(但在查询中存在)。当我启动应用程序时,我先打开 cdsA,然后再打开 cdsB。出了点问题。链接到 dsA 数据源的 DBGrid 显示数据,链接到 dsB 的 DBGrid 不显示任何内容。SQLMonitor 日志文件显示在 B 中实现的查询已执行(一个简单的select a, b, c from tableB)。如果我更改查询并显示字段“X”(select a, b, c, X from tableB),这些东西工作正常,其中“X”是 B.IndexFieldNames 属性引用的字段。

为什么链接到 dsB 的 DBGrid 不显示与 cdsA 的当前记录相关的 B 记录?仅当我IndexFieldNames在查询列中指定时它才有效吗?我错过了什么?TIA。

4

2 回答 2

2

我将解释使用适用于SQL Server 2008 R2的AdventureWorks数据库的完整场景。我还将假设您已经放置了组件并正确设置了它的参数以建立与数据库的连接。对于此示例,我还将假设它的名称为Conn1TSQLConnection

在表单上,​​放置 2 TSQLTable(命名为tableAtableB)、2 TDataSetProvider(命名为dspAdspB)、2 TClientDataSet(命名为cdsAcdsB)、2 TDataSource(命名为dsAdsB)和 2 TDBGrid(命名为gridAgridB)组件。

设置属性如下:

tableA.SQLConnection = Conn1
tableA.SchemaName = Sales
tableA.TableName = Customer
tableA.Active = True

dspA.DataSet = tableA

cdsA.ProviderName = dspA
cdsA.Active = True

dsA.DataSet = cdsA

gridA.DataSource = dsA

tableB.SQLConnection = Conn1
tableB.SchemaName = Sales
tableB.TableName = SalesOrderHeader
tableB.Active = True

dspB.DataSet = tableB

cdsB.ProviderName = dspB
cdsB.MasterSource = cdsA
cdsB.MasterFields = CustomerID
cdsB.Active = True

dsB.DataSet = cdsB

gridB.DataSource = dsB

gridA 中,您应该看到所有Customers,在gridB中,您应该只看到与当前选择的客户相关的Orders 。

这是在 Delphi 中建立两个 TClientDataSet 组件之间的主/从关系的基本示例。但是,还有其他方法可以做到这一点。

于 2011-11-22T02:10:10.100 回答
0

Cary Jensen 的“Delphi In Depth: Client DataSets”一书中概述了我链接 ClientDataSets 的方式。照常设置 Master 和 Detail 数据集,并确保它们通过 TDataSource 链接(您将在 Detail SQL 中有一个参数将其链接到 Master)。但是,CJ 建议只有一个附加到主服务器的 DataSetProvider。但是主服务器(以及因此的 DSP)将有一个嵌套数据集来重新表示详细信息表。详细/嵌套数据集可以出现在主表 DBGrid 或它自己的 DBGrid 中。您的gridB将链接到嵌套数据集。

gridB直接链接回 TSQLQuery(据我了解)的问题是对主 CDS 的任何更新都不会反映在 gridB 中。如果您想查看更多内容,可以从 Cary 的网站下载 NestedFromMasterDetail 项目。

如果你真的想知道更多,那就买一本 Cary 的书。我发现它对于理解客户端数据集非常宝贵。它们的设置有些不同,Cary 很好地解释了它们的架构。

于 2011-11-22T07:21:56.953 回答