【发布时间】:2017-09-26 13:13:19
【问题描述】:
我有一个 TFDConnection 到一个 FireBird 数据库,我为此申请了 Data type mapping 以向后兼容以前的数据访问技术 (SQLDirect):
with FormatOptions.MapRules.Add do // TIMESTAMP will be ftDateTime instead of ftTimeStamp
begin
SourceDataType := dtDateTimeStamp;
TargetDataType := dtDateTime;
end;
with FormatOptions.MapRules.Add do // FLOAT will be ftFloat instead of ftSingle
begin
SourceDataType := dtSingle;
TargetDataType := dtDouble;
end;
FormatOptions.OwnMapRules := true;
在运行时,我创建了一个链接到该 TFDConnection 的 TFDQuery。
我可以看到它继承了映射规则:FormatOptions.MapRules.count=2
我为其 SQL.Text 分配一个 INSERT 查询:
insert into TT_ACT (TT_ACT_ID,TT_PARENT_ID,TT_FROMDATE,TT_TODATE,TT_NAME,TT_NR,TT_CODE,TT_GROUP...)
values (:TT_ACT_ID,:TT_PARENT_ID,:TT_FROMDATE,:TT_TODATE,:TT_NAME,:TT_NR,:TT_CODE,:TT_GROUP,...)
这给了我params.count=42 带有数据类型为 ftUnknown 的参数(当然)。
然后我调用 Prepare 进行查询。
如果我现在检查一个已知的日期时间参数,我看到的是params[x].datatype = ftTimeStamp,而不是ftDateTime。
所以当查询回数据库查看字段时,在设置参数的时候似乎没有监听数据映射规则。
这是一个错误吗?
在我的代码后期,这让我陷入了麻烦,导致了著名的 338 错误:
[FireDac][Phys][IB]-338 Param [TT_FROMDATE] type changed from [ftSQLTimeStamp] to [ftDateTime]. Query must be reprepared.
我设法解决了这个错误,所以这不是问题的一部分。但我希望 Params 也遵循数据类型映射规则,这会使这一切变得更容易。
【问题讨论】:
标签: delphi parameters firedac delphi-10.2-tokyo