【发布时间】:2021-04-13 19:55:14
【问题描述】:
我有一个 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 语句中参数名称后的字符: ie..... WHERE e.id = :id;应该是......WHERE e.id = :id
-
我也想知道你为什么在 SQL 语句中使用 AnsiString 而不是 String?我认为这在这一点上没有任何用处。
-
@RogerCigol 我同意。然而,这是一个维护项目,有十多年历史的代码库(目前使用 Borland C++ 2007 编译),原作者只在所有地方使用这种类型。就是这样。
-
C++ 2007 !!!我很确定参数化的 SQL 语句在很久以前就不被支持......
标签: c++ mysql odbc c++builder ado