0

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

在此处输入图像描述

组件的数据类型是(第一行,从左到右):TDBGrid, TDataSource, TClientDataSet, TDataSetProvider, TSQLQuery, TSQLConnection. 第二行类似于第一行。

客户端数据集Query_LimitDetail通过属性MasterSourceMasterFields. 它们的值如下:

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

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

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

这就是我打开查询的方式:

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

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

dbExpress driver does not support the TDBXTypes.UNKNOWN data type. Vendor error message: unknown ISC error 0

有什么我没有正确制作的吗?

4

1 回答 1

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";
于 2012-11-07T11:14:26.950 回答