/ / TFDQuery.Prepare kann keine Parametertypen für die INSERT-Abfrage auf MS SQL SERVER ermitteln - SQL-Server, Delphi, Firedac, Delphi-10.2-tokyo

TFDQuery.Prepare kann keine Parametertypen für die INSERT-Abfrage auf MS SQL SERVER ermitteln - SQL-Server, Delphi, Firedac, Delphi-10.2-tokyo

Ich öffne eine TFDConnection für MS SQL Server mit Parametern:

DriverID=MSSQL
Password=test
User_Name=test
Server=VS2003-2008
Database=test
Single Connection=TRUE
Max Cursors=256
USE OLEDB=TRUE

Ich erstelle dann ein TFDQuery (Laufzeit), setzen Sie die Verbindung auf das Obige und füllen Sie eine parametrisierte INSERT-Abfrage:

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,...)

Ich rufe dann Prepare für die Abfrage an und erhalte:

[FireDAC][Phys][MSSQL]-335 Parameter [TT_ACT_ID] data type is unknown.
Hint: Specify TFDParam.DataType or Assign TFDParam.Value before Prepare/Execute call

Wenn ich dasselbe für eine FireBird-Datenbank mache, gibt es keine Probleme.
Ich denke, es hat etwas mit OLEDB zu tun. Es gibt keinen nativen MS SQL-Client auf dem Computer.
Es gibt kein FDPhysMSSQLDriverLink auf dem Datenmodul, wo die TFDConnection bleibt, aber das Hinzufügen eines macht keinen Unterschied.
Tabelle TT_ACT ist vorhanden.

Was vergesse ich, um diese Arbeit zu machen?

Antworten:

1 für die Antwort № 1

Ich würde der Hilfe hier folgen und vermeiden, anzurufen Bereiten bevor Parameter definiert werden (ihre Datentypen sind vollständig angegeben). Sie haben nichts außer dieser Anmerkung von der Hilfe verpasst:

Es wird empfohlen, die Parameter vor dem einzustellen Bereiten Anruf.

Für gängige ODBC-Treiber (mit denen Sie immer noch sprecheneinem ODBC-Treiber (egal, ob sie intern OLE DB für die Kommunikation mit dem DBMS verwenden), bestimmt FireDAC keine Parameterdatentypen für den vorbereiteten Befehl. Stattdessen bereitet sie eine Befehlsanweisung auf dem Ziel-DBMS vor und versucht, vorhandene vom DBMS zu binden Params Sammlung. Das ist wie das Bereiten Methode ist implementiert (Tokyo).

ODBC-API bietet die SQLDescribeParam Funktion, um Parameterdetails für dieDer vorbereitete Befehl, aber FireDAC verwendet ihn nicht (zu diesem Zeitpunkt) an beliebiger Stelle. Stattdessen verlässt er manuell die Erstellung von Parametersätzen bestimmten Befehlsparameter, um diesen Wertetyp zu kennen.


0 für die Antwort № 2

Stellen Sie jeden Ihrer Parameter ein Datentyp Eigenschaft, und dann können Sie anrufen Bereiten zB:

  qry.ParamByName("foo").DataType := TFieldType.ftString;
qry.ParamByName("bar").DataType := TFieldType.ftInteger;
qry.Prepare;

Das DataType Eigenschaft ist vom Typ Data.DB.TFieldType, Hier ist eine Liste aller möglichen Werte