如何使用 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 的匿名参数。