我已经下载并安装了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/