0

これは私のdbコンポーネントがプログラムで接続される方法です:

ここに画像の説明を入力してください

コンポーネントのデータ型は(最初の行TDBGrid、左から右へ)TDataSource:、、、、、、、。2番目の行は最初の行に類似しています。TClientDataSetTDataSetProviderTSQLQueryTSQLConnection

クライアントデータセットは、プロパティと 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 に答える