【发布时间】: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据我所知。此外,Delphivariant类型具有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 参数空查询”并且至少有一些链接