【问题标题】:Delphi IBX to Firedac Migration For FirebirdDelphi IBX 到 Firebird 的 Firedac 迁移
【发布时间】:2019-02-26 08:22:22
【问题描述】:

我将一个包含 500 多个表单的 IBX 应用程序迁移到 Firedac。我用 Delphi Help 映射了数据类型。这是我的数据映射:

  with ADB.FormatOptions do
  begin
    OwnMapRules := True;
    DefaultParamDataType := ftVariant;

    MapRules.Clear;
    with MapRules.Add do
    begin
      PrecMax        := 4;
      PrecMin        := 0;
      ScaleMax       := 0;
      ScaleMin       := 0;
      SourceDataType := dtFmtBCD;
      TargetDataType := dtInt16;
    end;

    with MapRules.Add do
    begin
      PrecMax        := 10;
      PrecMin        := 5;
      ScaleMax       := 0;
      ScaleMin       := 0;
      SourceDataType := dtFmtBCD;
      TargetDataType := dtInt32;
    end;

    with MapRules.Add do
    begin
      PrecMax        := 18;
      PrecMin        := 11;
      ScaleMax       := 0;
      ScaleMin       := 0;
      SourceDataType := dtFmtBCD;
      TargetDataType := dtInt64;
    end;

    with MapRules.Add do
    begin
      SourceDataType := dtFmtBCD;
      TargetDataType := dtDouble;
    end;

    with MapRules.Add do
    begin
      SourceDataType := dtDateTimeStamp;
      TargetDataType := dtDateTime;
    end;
  end;

这个映射是真的吗?如果是假的,我怎么会是真的?

当一个 FDQuery 有参数并且一个参数在执行查询时没有值时,会发生异常:

[FireDAC][物理][FB]-338。参数 [XXX] 类型从 [ftVariant] 更改为 [ftInteger]。必须重新准备查询。可能的原因:对 TFDParam.AsXXX 属性的赋值隐式更改了参数数据类型。提示:使用 TFDParam.Value 或适当的 TFDParam.AsXXX 属性

我该如何解决这个问题?谢谢你的一切。

【问题讨论】:

  • 您是在问 BCD 格式的字段是否可以映射到整数?
  • 我问真正的 Firedac Firebird 映射可能的情况@MartynA
  • 好吧,您的 BCD 数据是否可以安全映射到整数当然取决于实际存储的值。所以从这个角度来看,我认为这是一个无法回答的问题。
  • "When .... parameter has no value" - 这意味着它应该是 SQL NULL 据我所知。此外,Delphi variant 类型具有 null 作为可能值。我没有使用 AnyDAC,但可能相关(TParam 类型可能由所有 db-aware 兼容的访问库共享)使用 Delphi XE2 dbExpress 的经验表明,必须按照正确的顺序执行两个步骤:Par1 := Query1.ParamByName('...'); Par1.Clear {sets *both* Null value and null/variant type}; Par1.DataType := ftInteger {or any other expected type};
  • 想想DefaultParamDataType := ftVariant;——也许你可以删除那行,或者写上ftNull之类的东西。也许有一些特殊的规则可以将NULL 值强制转换为TargetDataType 中的任何一个而无需重新转换。可悲的是,原始 AnyDAc 网站已关闭,包括那里的文档,但谷歌“必须重新准备 anydac firebird 参数空查询”并且至少有一些链接

标签: delphi firebird firedac


【解决方案1】:

我使用下面的映射解决了我的问题:

with ADB.FormatOptions do
begin
  OwnMapRules := True;

  with MapRules.Add do
  begin
    SourceDataType := dtDateTimeStamp;
    TargetDataType := dtDateTime;
  end;

  with MapRules.Add do
  begin
    SourceDataType := dtDateTime;
    TargetDataType := dtDateTimeStamp;
  end;
end;

在我构建我的应用程序并对其进行测试之后。结果对我来说没问题。

【讨论】:

  • 所以Think about DefaultParamDataType := ftVariant; - maybe you can remove that line工作了
  • 如你所见,我不使用 ftvariant。问题是整数和浮点映射。
  • 是的,你使用了它,但是你通过 mu 的建议删除了它。我引用了之前有问题的 cmets 自己。
猜你喜欢
  • 1970-01-01
  • 2019-05-10
  • 2018-09-18
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多