如何解决如何使用 MySQL 和 TADOQuery 实例使用参数?
我有一个 TADOConnection
指向 MySQL 8.0 实例。连接已经过测试并且可以正常工作。按照关于如何使用准备好的语句的 this 示例,我遇到了一个错误,我不知道为什么。
以下代码工作正常,它将从最后一个语句返回 true
。没有错误,没有警告。
AnsiString sqlQuery = "SELECT e.name FROM employee e WHERE e.id = 1;";
if (!_query->Connection->Connected) {
try {
_query->Connection->Connected = true;
} catch (EADOError& e) {
return false;
}
}
_query->SQL->Clear();
_query->SQL->Add(sqlQuery);
_query->Prepared = true;
try {
_query->Active = true;
if (_query->RecordCount == 0) {
return false;
}
} catch (EADOError& e) {
return false;
}
return true;
但是,以下代码无法使用 this error 执行 _query->SQL->Add(sqlQuery);
:
参数类型错误、超出可接受范围或相互冲突。
AnsiString sqlQuery = "SELECT e.name FROM employee e WHERE e.id = :id;";
if (!_query->Connection->Connected) {
try {
_query->Connection->Connected = true;
} catch (EADOError& e) {
return false;
}
}
_query->SQL->Clear();
_query->SQL->Add(sqlQuery); // <---- EOleException here
_query->Parameters->ParamByName("id")->Value = id;
_query->Prepared = true;
try {
_query->Active = true;
if (_query->RecordCount == 0) {
return false;
}
} catch (EADOError& e) {
return false;
}
return true;
无论我在哪里找到示例,它们都使用 :paramName
来指定参数。我错过了什么?
更新 1
我尝试过像这样更改代码:
_query->SQL->Clear();
TParameter * param = _query->Parameters->AddParameter();
param->Name = "id";
param->Value = 1;
_query->SQL->Add(sqlQuery); // <---- EOleException still here
一些论坛帖子建议将高级编译器选项“注册变量”切换为“无”,但这已经是我项目的设置,仍然抛出异常。
更新 2
我可以忽略错误,并且一切都执行得很好,但是每当我执行分步执行时它都会失败。当然,我仍然可以在之后放一个断点,然后直接跳过错误的那一行,但是还是很烦人,并且没有解释为什么在第一个出现这个错误地点。
解决方法
例外是设置 SQL 字符串 - 它告诉您这是错误的。根据@RogerCigol 的评论,您的 SQL 字符串末尾不应包含 ;
。
为此向罗杰致敬。
如果要访问参数,必须先设置 SQL 字符串,它将被解析以识别参数。参数在解析字符串之前不会存在,或者您手动创建它们(这毫无意义,因为它们会在解析字符串时重新创建)。
您还可以将参数作为有序索引访问,而且我一直能够使用 ?
作为 MySQL 的匿名参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。