仅通过分配查询文本来获取"参数类型错误..."异常

Kro*_*ica 7 mysql delphi

我已经下载并安装了MySQL Connector 5.1 x64,所以我可以使用MySQL和Delphi.我可以与ODBC建立连接,并从我的Delphi环境和MySQL Workbench进行连接.

但是,当我在运行时构建我的查询时,我得到一个错误说:

项目AAA.exe引发异常类EOleException,消息"参数类型错误,超出可接受的范围,或者彼此冲突".流程停止了.使用"步骤"或"运行"继续.

我的代码:

qDates := TADOQuery.Create(Component);
qDates.Connection := FConnection;
qDates.SQL.Text :=
  'select ' +
  '  * ' +
  'from ' +
  '  resulttable ' +
  'where ' +
  '  oid = :oid ' +
  '  and datedial >= :datebegin and datedial <= :dateend'; // <<-- Exception here
Run Code Online (Sandbox Code Playgroud)

详细信息:
在我有机会配置参数之前,异常发生在文本分配上.
如果我注释掉这个where条款,那么任务就可以了.
这与使用参数和ADO查询(mysql/MyConnector)类似,但区别在于我一次分配整个文本,并且在有机会配置参数之前我得到了异常.

令人费解的部分 - 完全相同的代码在我的其他机器上工作正常,但我无法弄清楚有什么不同.

因此问题 - 什么可能导致Delphi代码和MySQL服务器之外的上述异常?

who*_*ddy 5

这似乎是MySQL ODBC提供程序的一个怪癖.

如果在设置SQL文本后分配连接,那么它将起作用.原因可以在这里找到.

qDates := TADOQuery.Create(Component);
// do net yet assign TADOConnection to prevent roundtrip to ODBC provider
qDates.SQL.Text :=
  'select ' +
  '  * ' +
  'from ' +
  '  resulttable ' +
  'where ' +
  '  oid = :oid ' +
  '  and datedial >= :datebegin and datedial <= :dateend';
qDates.Connection := FConnection;
Run Code Online (Sandbox Code Playgroud)

UPDATE

QC条目解释了此问题的确切原因.

简而言之,ADODB单元从RefreshFromOleDB程序补丁这一行:

      Parameter.Attributes := dwFlags and $FFFFFFF0; { Mask out Input/Output flags }
Run Code Online (Sandbox Code Playgroud)

至:

if dwFlags and $FFFFFFF0 <= adParamSigned + adParamNullable + adParamLong then
 Parameter.Attributes := dwFlags and $FFFFFFF0; { Mask out Input/Output flags }
Run Code Online (Sandbox Code Playgroud)