Ich habe eine TFDConnection
zu einer Firebird-Datenbank, für die ich Data type mapping für die Abwärtskompatibilität mit früheren Datenzugriffstechnologie (SQLDirect) gelten:FireDAC-Zuordnungsregeln gelten nicht für Parameter?
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;
Zur Laufzeit erstelle ich eine TFDQuery, die ich zu diesem TFDConnection verknüpfen.
Ich kann sehen, dass es die Zuordnungsregeln erbt: FormatOptions.MapRules.count=2
ich eine INSERT-Abfrage an seinen SQL.Text zuweisen:
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,...)
Das ist mir params.count=42
mit Parametern mit Datentyp ftUnknown gibt (natürlich).
Ich rufe dann Prepare für die Abfrage. Wenn ich nun einen bekannten Datetime Parameter überprüfe, sehe ich params[x].datatype = ftTimeStamp
, nicht ftDateTime
. Also, wenn die Abfrage zurück in die Datenbank geht, um die Felder zu sehen, scheint es nicht auf die Datenzuordnungsregeln bei der Einrichtung der Parameter zu hören.
Ist das ein Fehler?
In einer späteren Phase in meinem Code das hat mir in Schwierigkeiten, die sich in der berühmten 338-Fehler:
[FireDac][Phys][IB]-338 Param [TT_FROMDATE] type changed from [ftSQLTimeStamp] to [ftDateTime]. Query must be reprepared.
ich um diesen Fehler zu arbeiten, verwaltet werden, so dass nicht Teil der Frage ist. Aber ich würde erwarten, dass die Params auch den Regeln für das Mapping von Datentypen folgen, was all das erleichtert hätte.
O, wow, das ist unbequem.Bei der Abfrage von * Daten funktionierte mein Mapping wie erwartet (Ohne die Mapping-Regeln erscheint ein FireBird TIMESTAMP als ftTimeStamp; mit den Regeln als ftDateTime). Wenn ich Sie richtig verstehe: Wenn ich dann nach ptInput ParamType mappen möchte, muss ich das Mapping für die Abfrage in umgekehrter Richtung überschreiben. –
Aber wie Sie hier sagen und [in Ihrer anderen Antwort] (https://Stackoverflow.com/a/46432053/512728) werde ich meinen Code umschreiben, um die Parameter-Sammlung selbst zu erstellen. –
Ja, es hat funktioniert, weil Sie Kartendetails für Ergebnisfelder definiert haben. Was ich definiert habe, sind Map-Regeln für Parameter. Es ist ein bisschen irreführend, aber immer noch lesbar. Für Parameter ist Quelle Parameter, Ziel-DBMS-Feld. Für das Resultset-Feld ist die Quelle das DBMS-Feld, das Ziel-Resultset-Feld. Wenn Sie sowohl für Ergebnismengenfelder als auch für Parameter Kartenregeln verwenden möchten, müssen Sie für jede Datentypzuordnung (für beide Richtungen) 2 Regeln definieren. – Victoria