TFDQuery.Prepare cannot determine parameter types for INSERT query on MS SQL SERVER

旧时模样 提交于 2020-01-10 04:36:27

问题


I open a TFDConnection for MS SQL Server with parameters:

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

I then create a TFDQuery (run time), set its connection to the above, fill it with an parameterized INSERT query:

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

I then call Prepare for the query and get:

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

If I do the same for a FireBird database there are no issues.
I guess it has something to do with using OLEDB. There is no native MS SQL client on the machine.
There is no FDPhysMSSQLDriverLink on the datamodule where the TFDConnection resides, but adding one makes no difference.
Table TT_ACT exists.

What am I forgetting to make this work?


回答1:


I would follow help here and avoid calling Prepare before parameters are defined (their data types are fully specified). You haven't missed anything but this note from help:

It is recommended to setup parameters before the Prepare call.

For common ODBC drivers (you are still talking to an ODBC driver, no matter if they internally uses OLE DB to communicate with the DBMS), FireDAC doesn't determine parameter data types for the prepared command. Instead, it prepares command statement on the target DBMS and tries to bind existing ones from the Params collection. That's how the Prepare method is implemented (Tokyo).

ODBC API provides the SQLDescribeParam function to obtain parameter details for the prepared command, but FireDAC doesn't use it anywhere (at this time). Instead, it leaves building parameter collection manually. Which is not wrong, because in the end, it is the developer who needs to know which value to assign to a certain command parameter so as to know this value type.




回答2:


Set each of your parameters DataType property, and then you can call Prepare ie:

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

The DataType property is of type Data.DB.TFieldType, here is a list of all possible values



来源:https://stackoverflow.com/questions/46428723/tfdquery-prepare-cannot-determine-parameter-types-for-insert-query-on-ms-sql-ser

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!