这是我的数据库组件在程序中的连接方式:
组件的数据类型是(第一行,从左到右):TDBGrid
,TDataSource
,TClientDataSet
,TDataSetProvider
,TSQLQuery
,{{ 1}}。第二行类似于第一行。
客户数据集TSQLConnection
通过属性Query_LimitDetail
和MasterSource
链接到主数据源。他们的价值观如下:
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();
我有没有做错的事情?
答案 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";