将null转换为0.00 delphi

时间:2019-01-04 18:06:07

标签: delphi firedac

我继承了一个程序,该程序将所有信息从一个数据库表复制到另一个数据库中。我相信该程序是用delphi 7编写的,并且正在使用IDAC。一旦获得它,我便将其转换为Delphi 10.1,并将其移至使用FireDac。我遇到的问题是原始表中的字段具有空值。当我将其移至另一个数据库时,它将其从null转换为0.00。在原始程序中,这没有发生,我无法在代码中找到任何内容来告诉它执行此操作。有谁知道如何将其插入null而不是对其进行转换。

2 个答案:

答案 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。