TFDQuery.Prepare 无法确定 MS SQL SERVER 上的 INSERT 查询的参数类型

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

我为 MS SQL 打开一个 TFDConnection 服务器,参数为:

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

然后我创建一个TFDQuery(运行次),将其连接设置为上面的,用参数化的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,...)

然后我为查询调用 Prepare 并得到:

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

如果我对 FireBird 数据库执行相同的操作,则没有问题。
我猜这与使用OLEDB有关。机器上没有本机 MS SQL 客户端。
TFDConnection 所在的数据模块上没有 FDPhysMSSQLDriverLink,但是添加一个没有区别。
Table TT_ACT 存在。

我忘记了什么来完成这项工作?

设置您的每个参数DataType property, and then you can call Prepare 即:

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

DataType属性是Data.DB.TFieldType类型,here是所有可能值的列表

我会按照这里的帮助,避免在定义参数(它们的数据类型已完全指定)之前调用 Prepare。除了来自帮助的这条注释,你没有错过任何东西:

It is recommended to setup parameters before the Prepare call.

对于普通的ODBC 驱动程序(你仍然在与ODBC 驱动程序通信,无论它们是否在内部使用OLE DB 与DBMS 通信),FireDAC 不会确定准备好的命令的参数数据类型。相反,它会在目标 DBMS 上准备命令语句,并尝试绑定 Params 集合中的现有语句。这就是 Prepare 方法的实现方式(东京)。

ODBC API 提供SQLDescribeParam 函数来获取准备命令的参数详细信息,但FireDAC 没有在任何地方(此时)使用它。相反,它保留手动构建参数集合。这并没有错,因为说到底,是开发者需要知道给某个命令参数赋什么值,从而知道这个值的类型。