我已经下载并安装了MySQL Connector 5.1 x64,因此可以在Delphi中使用MySQL。我可以与ODBC建立连接,并可以从我的Delphi环境和MySQL Workbench建立连接。

但是,当我在运行时构建查询时,出现一条错误消息:



我的代码:

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

细节:
在我有机会配置参数之前,该异常恰好发生在文本分配上。
如果我注释掉where子句,分配会很好。
这类似于Using parameters with ADO Query (mysql/MyConnector),但是不同之处在于,我立即分配了整个文本,并且在有机会配置参数之前得到了异常。

令人费解的部分-完全相同的代码在我的另一台机器上可以正常工作,但是我不知道有什么不同。

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

最佳答案

这似乎与MySQL ODBC提供程序有关。

如果在设置SQL文本后分配连接,则它将起作用。
可以找到here的原因。

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;

更新

QC entry解释了此问题的确切原因。

简而言之,ADODB单元从RefreshFromOleDB过程中修补了这一行:
      Parameter.Attributes := dwFlags and $FFFFFFF0; { Mask out Input/Output flags }

到:
if dwFlags and $FFFFFFF0 <= adParamSigned + adParamNullable + adParamLong then
 Parameter.Attributes := dwFlags and $FFFFFFF0; { Mask out Input/Output flags }

关于mysql - 仅通过分配查询文本即可获取 “Arguments are of the wrong type…”异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31140281/

10-15 23:14
查看更多