null 转换为 0.00 delphi

null converting to 0.00 delphi

我继承了一个程序,可以将所有信息从一个数据库 table 复制到另一个数据库中。该程序是在 delphi 7 中编写的,我相信并且正在使用 IDAC。拿到它后,我将其转换为 Delphi 10.1,并将其移至使用 FireDac。我遇到的问题是在原来的 table 中,它有带空值的字段。当我将它移到另一个数据库时,它将它从空值转换为 0.00。在原始程序中,这并没有发生,我在代码中找不到任何东西来告诉它这样做。有谁知道如何让它插入 null 而不是转换它。

在您的(或 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 方法进行复制。

将代码中 (SomeField).Value 的所有引用更改为 (SomeField).AsVariant。因为在 FireDAC 中 .Value 被转换为 integer/float/string/...(如 .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.