如何使用主/明细关系连接两组数据库组件?

时间:2012-11-05 14:40:37

标签: master-detail dbexpress c++builder-xe2

这是我的数据库组件在程序中的连接方式:

enter image description here

组件的数据类型是(第一行,从左到右):TDBGridTDataSourceTClientDataSetTDataSetProviderTSQLQuery,{{ 1}}。第二行类似于第一行。

客户数据集TSQLConnection通过属性Query_LimitDetailMasterSource链接到主数据源。他们的价值观如下:

MasterFields

分配给客户端数据集的SQL命令是:

Query_LimitDetail->MasterSource = DataSource_Limit;
Query_LimitDetail->MasterFields = L"ID";

这是我打开查询的方式:

select * from LIMIT order by NAME
select * from LIMITDETAIL where LIMIT_ID = :ID order by ACCUR

尝试打开详细信息查询时,程序会抛出以下错误:

Query_Limit->Open(); Query_LimitDetail->Open();

我有没有做错的事情?

1 个答案:

答案 0 :(得分:0)

解决方案是在打开查询之前设置SQL参数类型:

Query_Limit->Close();
Query_Limit->Open();

// ID param
TParam   *param = Query_LimitDetail->Params->Items[0];
param->DataType = ftInteger;

Query_LimitDetail->Close();
Query_LimitDetail->Open();

替代和更通用的解决方案是在OnBeforeOpen事件处理程序中设置参数类型,如下所示:

__fastcall MyDataModule::MyDataModule(TComponent *Owner) :
    TDataModule(Owner)
{
    ...
    Query_LimitDetail->BeforeOpen = Query_LimitDetail_OnBeforeOpen;
    ...
}

void __fastcall MyDataModule::Query_LimitDetailBeforeOpen(TDataSet *DataSet)
{
   if (Query_LimitDetail->Params->Count == 0)
   {
      return;
   }

   // ID param
   TParam   *param = Query_LimitDetail->Params->Items[0];
   param->DataType = ftInteger;
}

将主表(在MasterFields属性中指定)中的列链接到详细信息表中的列也是必要的:

Query_LimitDetail->IndexFieldNames = L"LIMIT_ID";