Delphi 参数化查询将不起作用

Delphi Parameterised Query won't work

我只是学习使用参数化查询的初学者,因为我以前做过很多连接。我一直在尝试使下面的查询正常工作。它是一个简单的 'Book' table,带有一个名为 'BookTitle' 的字段。我有一个简单的文本框,我邀请用户在其中输入任何标题...它应该 运行 下面的查询以查找该书是否存在。下面是我的代码,当 运行 时,它设法编译。但是,当向文本框中添加一个条目并按下 运行 的 按钮时,查询被按下 ,出现带有以下语句的调试器异常通知。

Debugger Exception Notification: Project Project1.exe raised exception class EOleException with message 'Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another'.

然后我可以选择按 'Break' 或 'Continue'。如果我按 'Break',行:

qbook.Parameters.ParamByName('BookTitle').DataType := ftString;

填充了 purple/red 颜色(不确定这是什么意思?)。

就是说,如果我按 'Continue',程序将按预期运行,并将继续运行。这是我一直在测试的代码。

procedure TForm4.btnRunQueryClick(Sender: TObject);
var BookEntry:string;
begin
 BookEntry:=edtBookTitle.Text;
 qbook.SQL.Text:='SELECT BookTitle FROM Book WHERE BookTitle = :BookTitle';
 qbook.Parameters.ParamByName('BookTitle').DataType := ftString;
 qbook.Parameters.ParamByName('BookTitle').Value := BookEntry;
 qbook.Open;
end;

另外需要注意的地方:我的Delphi表单中的组件如下 名为 'qbook'、
的 TADOQuery 一个 TDataSource, 一个 TDB 网格, aTEdit,用户在其中输入他们想要的搜索条件和 按下后启动查询的 TButton。

关于数据库,是: MySQL 数据库(社区版) a table named 'Book',其中 BookID 为 PK,为 INT 数据类型。 标题为 'BookTitle' 的字段,我将其设置为 VARCHAR(35)。它不是密钥的一部分。但是,我想在 BookTitle 字段中应用我的查询。

注意:此答案是根据问题中的原始代码 post 编辑的,该代码已被编辑以匹配我的答案中的内容。请参阅问题的 revision history,了解我的回答所基于的问题的第一个版本。

您在另一个post中看到的解决方案是正确的;它只是针对标准 TQuery 而不是 TADOQueryTADOQuery 需要一些小的语法更改:

  • 使用Parameters.ParamByName()代替Parameters
  • 在使用之前为每个参数设置一个DataType
  • 使用.Value代替.AsString

这是您的代码的更正版本(其中还包括在使用前为 BookTitle 设置一个值。

procedure TForm4.btnRunQueryClick(Sender: TObject);
var 
  BookEntry:string;
begin
  BookEntry := 'Some book title';   // or QueryEdit.Text or whatever

  qbook.SQL.Text:='SELECT BookTitle FROM Book WHERE BookTitle = :BookTitle';
  qbook.Parameters.ParamByName('BookTitle').DataType := ftString;
  qbook.Parameters.ParamByName('BookTitle').Value := BookEntry;
  qbook.Open;
end;

我从来不知道字符串类型查询参数需要数据类型或任何设置,我会简单地删除对该数据类型的任何引用。

毕竟,如果用头撞墙会痛,那就别再撞了。