【问题标题】:How to use parameters using MySQL and a TADOQuery instance?如何使用 MySQL 和 TADOQuery 实例使用参数?
【发布时间】: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


【解决方案1】:

例外是设置 SQL 字符串 - 它告诉您它是错误的。根据@RogerCigol 的评论,您的 SQL 字符串末尾不应有 ;。

为此向罗杰表示敬意。

如果你想访问参数,你必须先设置SQL字符串,它会被解析来识别参数。在解析字符串之前,参数将不存在,或者您手动创建它们(这是没有意义的,因为它们将在解析字符串时重新创建)。

您也可以将参数作为有序索引访问,我一直可以将? 作为 MySQL 的匿名参数。

【讨论】:

  • 感谢您的回答,但删除尾随分号 ; 不会改变任何内容。我还测试了首先创建参数,它没有改变任何东西。事实上,这个错误似乎毫无意义,因为我可以忽略它。因此,在解析 SQL 之前创建参数或在解析 SQL 之后访问它们不会改变任何内容。简而言之,即使我可以忽略这个错误,它仍然无法解释它为什么会发生,以及它是如何被删除的。
  • 该示例显示使用字符串,而不是 AnsiString,并且属性 SQL 被定义为 TStrings - 所以我希望它需要一个字符串。鉴于它是一个 EOleException,您可能会看到它是否也对 BSTR 感到满意......
猜你喜欢
  • 2013-04-18
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多