Delphi 无法将数据分配给客户端数据集
我在Delphi应用程序中使用分配了本地数据的Delphi 无法将数据分配给客户端数据集,delphi,delphi-xe2,tclientdataset,Delphi,Delphi Xe2,Tclientdataset,我在Delphi应用程序中使用分配了本地数据的TClientDataSet来比较位于两个不同数据库中的两个表之间的数据。我正在使用的东西: SpPlansQuery:TADOQuery–原始数据查询 PPUQuery:TADOQuery–已更改的数据查询(使用与SpPlansQuery不同的ADO连接) ComparisonDataSet:TClientDataSet–仅显示前两个查询之间差异的数据集 我试图填写ComparisonDataSet,如下所示(我大量减少代码以突出问题): 过
TClientDataSet
来比较位于两个不同数据库中的两个表之间的数据。我正在使用的东西:
–原始数据查询SpPlansQuery:TADOQuery
–已更改的数据查询(使用与SpPlansQuery不同的ADO连接)PPUQuery:TADOQuery
–仅显示前两个查询之间差异的数据集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']
。是这样吗?您肯定想识别一个字段,而不是所有字段?谢谢。事实上我找到了一个解决办法。我有一个导致异常的计算字段。