Delphi 无法将数据分配给客户端数据集

Delphi 无法将数据分配给客户端数据集,delphi,delphi-xe2,tclientdataset,Delphi,Delphi Xe2,Tclientdataset,我在Delphi应用程序中使用分配了本地数据的TClientDataSet来比较位于两个不同数据库中的两个表之间的数据。我正在使用的东西: SpPlansQuery:TADOQuery–原始数据查询 PPUQuery:TADOQuery–已更改的数据查询(使用与SpPlansQuery不同的ADO连接) ComparisonDataSet:TClientDataSet–仅显示前两个查询之间差异的数据集 我试图填写ComparisonDataSet,如下所示(我大量减少代码以突出问题): 过

我在Delphi应用程序中使用分配了本地数据的
TClientDataSet
来比较位于两个不同数据库中的两个表之间的数据。我正在使用的东西:

  • SpPlansQuery:TADOQuery
    –原始数据查询
  • PPUQuery:TADOQuery
    –已更改的数据查询(使用与SpPlansQuery不同的ADO连接)
  • ComparisonDataSet:TClientDataSet
    –仅显示前两个查询之间差异的数据集
我试图填写
ComparisonDataSet
,如下所示(我大量减少代码以突出问题):

过程TComparisonSpPlanForm.RefillDataSet;
常数
//重要提示:检查下两行中的字段数是否相同
FieldsStr1='文章\u PPU;承包商;收件人(S)PPU ;;OrderNum_PPU;OrderNum2_PPU;奥德努普;标题(PPU);;排队等候;高尔什图;权重1_PPU;材料;绘图(PPU);;图_PPU';
FieldsStr2='标题_1;标题3;标题4;号码;因努姆;onum;标题QNum;数量;重量;标题2;绘画图';
变量
删除:布尔值;
字段值2:变量;
字段值1:变量;
开始
比较数据集。禁用控件;
//清晰对比数据集
如果ComparisonDataSet.处于活动状态,则
比较数据集。关闭;
ComparisonDataSet.CreateDataSet;
//删除的记录
第一,;
而不是SpPlansQuery.Eof do
开始
FieldValues1:=SpPlansQuery[ReplaceStr(FieldsStr1,''u PPU','');
已删除:=非PPUQuery。查找('ID',整数(SpPlansQuery['PPONREC']),[]);
如果删除,则
开始
比较数据集。追加;
//下一个字符串抛出异常,这是一个大问题
比较数据集[ReplaceStr(FieldsStr1,'.'PPU',''):=FieldValues1;
比较数据集后;
结束;
SpPlansQuery.Next;
结束;
比较数据集。首先;
ComparisonDataSet.EnableControls;
结束;
据您所知,ComparisonDataSet包含名为
ARTICLE
ARTICLE\u PPU
的字段,当我尝试将值分配给
ComparisonDataSet['ARTICLE']时,出现异常消息“无法将变量类型(Null)转换为类型(整数)”。我知道这一点,因为我尝试直接分配给该字段,但得到了相同的结果

ARTICLE
是一个长度为20个字符的字符串字段

有人能告诉我如何在不出错的情况下为TClientDataSet中的字段赋值吗

根据以下要求,这是我的字段定义:

comparisonsplanunit.dfm
中:

对象比较数据集:TClientDataSet
聚合=
FieldDefs=<
...
项目
名称='ARTICLE'
数据类型=ftString
尺寸=20
结束>
...
对象比较数据源文件:TStringField
显示标签=#1057#1090#1072#1090#1100#1103
FieldName='ARTICLE'
结束
...
结束
comparisonsplanunit.pas中

comparisonadatasetarticle:TStringField;

在调试过程中,我发现异常在
Data.DB
模块的源代码深处,在
TStringField.SetVarValue
过程中引发,因此它似乎是一个bug。但我错了:更深层次的调试强调了在自动计算字段的计算过程中引发的异常

所以我不得不改变我的其他功能:

procedure TComparisonSpPlanForm.ComparisonDataSetCalcFields(DataSet: TDataSet);
begin
  // comparing to Null is essential!
  if DataSet['Oper'] <> Null then
    case DataSet['Oper'] of
      0: DataSet['OperStr'] := 'insert';
      1: DataSet['OperStr'] := 'update';
      2: DataSet['OperStr'] := 'delete';
      else
        DataSet['OperStr'] := 'other';
    end
  else
    DataSet['OperStr'] := 'other';
end;
procedure TComparisonSpPlanForm.ComparisonDataSetCalFields(数据集:TDataSet);
开始
//比较空值是必要的!
如果数据集['Oper']为空,则
的案例数据集['Oper']
0:DataSet['OperStr']:='insert';
1:数据集['Operst']:='update';
2:数据集['OperStr']:='delete';
其他的
数据集['Operst']:='other';
结束
其他的
数据集['Operst']:='other';
结束;

现在它可以工作了。

提示:如果ComparisondataSet.Active处于活动状态,则ComparisondataSet.Close处于关闭状态。你应该可以放弃if支票。请记住:没有贡献的代码可能对应用程序的运行无害,但它会妨碍代码维护。您是如何定义该字段的。您可能需要提供DFM片段或实际定义
ComparisonDataSet
@Craigyong added field Definition结构的代码。我有点不知所措,现在无法进行实验,但您是否尝试过
FieldByName()
?另外,我对这句话有点怀疑:
comparisonadaset[ReplaceStr(FieldsStr1,'.\u PPU','')
。给定常量值
FieldStr1
我希望其计算结果为:
ComparisonDataSet['Article;Contractor;Recipient;OrderNum;OrderNum2;OrdN;Title;Queue;KolSht;Weight1;Material;Drawing;Graph']
。是这样吗?您肯定想识别一个字段,而不是所有字段?谢谢。事实上我找到了一个解决办法。我有一个导致异常的计算字段。