我继承了一个程序,该程序将所有信息从一个数据库表复制到另一个数据库中。我相信该程序是用delphi 7编写的,并且正在使用IDAC。一旦获得它,我便将其转换为Delphi 10.1,并将其移至使用FireDac。我遇到的问题是原始表中的字段具有空值。当我将其移至另一个数据库时,它将其从null转换为0.00。在原始程序中,这没有发生,我无法在代码中找到任何内容来告诉它执行此操作。有谁知道如何将其插入null而不是对其进行转换。
答案 0 :(得分:2)
在您(或FireDAC)代码中的某个地方,该字段的值被当作整数类型的值处理。
您可以通过按以下内容逐个字段复制来避免此行为:
var
SourceField,
DestField : TField;
i : Integer;
begin
[...]
for i := 0 to SourceTable.FieldCount - 1 do begin
SourceField := SourceTable.Fields[i];
DestField := DestTable.Fields[i];
if SourceField.IsNull then
DestField.Clear // Sets DestField to Null
else
DestField.Value := SourceField.Value;
end;
[...]
end;
这当然假定源表和目标表具有相同的结构,并且这些字段均为非blob类型。任何blob字段都需要通过该字段的调用LoadFromStream和SaveToStream方法进行复制。
答案 1 :(得分:0)
在代码中将(SomeField) .Value 的所有引用更改为(SomeField) .AsVariant 。因为在FireDAC中, .Value 会转换为整数/浮点数/字符串/ ...(就像 .AsInteger 在Delphi 7中一样),因此您的空值会转换为0.00。
@MartynA的代码现在为:
var
SourceField,
DestField : TField;
i : Integer;
begin
[...]
for i := 0 to SourceTable.FieldCount - 1 do begin
SourceField := SourceTable.Fields[i];
DestField := DestTable.Fields[i];
DestField.AsVariant := SourceField.AsVariant;
end;
[...]
end;
对字段值的任何进一步访问都是通过 .AsVariant 方法完成的,因此空值不会读取为0。