我有一個TFDConnection
爲我申請Data type mapping爲了向後兼容以前的數據訪問技術(SQLDirect)一個Firebird數據庫:FireDAC映射規則不適用於參數?
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
我分配一個INSERT查詢到其SQL.Text:
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也遵循數據類型映射規則,這將使所有這些變得更容易。
O,哇,這很不方便。當查詢*數據時,我的映射按預期工作(沒有映射規則,FireBird TIMESTAMP顯示爲ftTimeStamp;規則爲ftDateTime)。如果我理解正確:如果我然後想要映射ptInput ParamType,我必須在相反的方向覆蓋查詢的映射。 –
但正如你在這裏說的和[在你的其他答案](https://stackoverflow.com/a/46432053/512728)我將重寫我的代碼來自己構建參數集合。 –
是的,它的工作原理是您定義的是結果集字段的映射規則。我定義的是參數的映射規則。這有點誤導,但仍然可讀。對於參數,源是參數,目標DBMS字段。對於結果集字段,源是DBMS字段,目標結果集字段。如果你想爲結果集字段和參數使用映射規則,則需要爲每個數據類型映射(對於兩個方向)定義2條規則。 – Victoria