我在我的Delphi应用程序中使用TClientDataSet
分配了本地数据来比较位于2个不同数据库中的2个表之间的数据。我正在使用的东西:
SpPlansQuery: TADOQuery
- 原始数据查询PPUQuery: TADOQuery
- 更改了数据查询(使用与SpPlansQuery不同的ADO连接)ComparisonDataSet: TClientDataSet
- 仅显示前两个查询之间差异的数据集我正在尝试填写ComparisonDataSet
,如下所示(我大大减少了我的代码以突出显示问题):
procedure TComparisonSpPlanForm.RefillDataSet;
const
// IMPORTANT: check that fields count in next 2 lines would be the same
FieldsStr1 = 'Article_PPU;Contractor_S_PPU;Recipient_S_PPU;OrderNum_PPU;OrderNum2_PPU;OrdN_PPU;Title_PPU;Queue_PPU;KolSht_PPU;Weight1_PPU;Material_PPU;Drawing_PPU;Graph_PPU';
FieldsStr2 = 'Title_1;Title_3;Title_4;num;inum;onum;Title;QNum;num_of;weight;Title_2;Drawing;Graph';
var
Deleted: Boolean;
FieldValues2: Variant;
FieldValues1: Variant;
begin
ComparisonDataSet.DisableControls;
// clear ComparisonDataSet
if ComparisonDataSet.Active then
ComparisonDataSet.Close;
ComparisonDataSet.CreateDataSet;
// deleted records
SpPlansQuery.First;
while not SpPlansQuery.Eof do
begin
FieldValues1 := SpPlansQuery[ReplaceStr(FieldsStr1, '_PPU', '')];
Deleted := not PPUQuery.Locate('ID', Integer(SpPlansQuery['PPONREC']), []);
if Deleted then
begin
ComparisonDataSet.Append;
// next string throws exception and this is a big problem
ComparisonDataSet[ReplaceStr(FieldsStr1, '_PPU', '')] := FieldValues1;
ComparisonDataSet.Post;
end;
SpPlansQuery.Next;
end;
ComparisonDataSet.First;
ComparisonDataSet.EnableControls;
end;
你可以猜到,ComparisonDataSet包含名为ARTICLE
和ARTICLE_PPU
的字段,当我尝试赋值时,会出现消息“无法将变量类型(Null)转换为类型(整数)”的异常到ComparisonDataSet['ARTICLE']
。我知道这是因为我尝试直接分配到该字段但得到了相同的结果。
ARTICLE
是一个字符串字段,长度为20个字符。
有人能指出如何为TClientDataSet中的字段赋值而不会出错吗?
根据以下要求,这是我的字段定义:
在ComparisonSpPlanUnit.dfm
:
object ComparisonDataSet: TClientDataSet
Aggregates = <>
FieldDefs = <
...
item
Name = 'ARTICLE'
DataType = ftString
Size = 20
end>
...
object ComparisonDataSetARTICLE: TStringField
DisplayLabel = #1057#1090#1072#1090#1100#1103
FieldName = 'ARTICLE'
end
...
end
在ComparisonSpPlanUnit.pas
:
ComparisonDataSetARTICLE: TStringField;
答案 0 :(得分:2)
在调试期间,我发现在Data.DB
过程内TStringField.SetVarValue
模块的源代码内部引发了异常,因此它似乎是一个错误。但我错了:深度调试突出显示在计算自动计算字段期间引发异常。
所以我不得不改变其他功能:
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;
现在有效。