Delphi参数化查询将无法正常工作

时间:2015-02-11 21:45:53

标签: sql delphi

我只是一个学习使用参数化查询的初学者,因为我之前做了很多连接。我一直试图让下面的查询工作。这是一本简单的书#39;表,带有一个名为“BookTitle'”的字段。我有一个简单的文本框,我邀请用户输入任何标题......它应该运行下面的查询以查找该图书是否存在。下面是我的代码,运行时,管理编译。但是,当添加文本框中的条目并按按钮以运行查询时,将显示调试器异常通知,其中包含以下语句。

  

调试器异常通知:Project Project1.exe引发了异常类EOleException,其中包含消息'参数类型错误,超出可接受范围或彼此冲突“#39;

然后我可以选择按“打破”#39;或者'继续'。如果我按下' Break',则行:

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

充满紫色/红色(不确定这意味着什么?)。

也就是说,如果我按“继续”,该程序将按预期工作,并将继续这样做。这是我正在测试的代码。

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, 一个TDBGrid, 用户输入所需搜索条件的aTEdit 一旦按下TButton,就会启动查询。

关于数据库,它是: MySQL数据库(社区版) 一个名为' Book'的表,其中BookID是PK并且是INT数据类型。 一个名为' BookTitle'我设置为VARCHAR(35)。它不是关键的一部分。但是,它在BookTitle字段中,我想应用我的查询。

2 个答案:

答案 0 :(得分:2)

注意:此答案是根据问题中的原始代码发布的,该代码已经过编辑以符合我的答案。有关我的答案所基于的问题的第一个版本,请参阅问题revision history

你在另一篇文章中看到的解决方案是正确的;它仅适用于标准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;

答案 1 :(得分:-1)

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

毕竟,如果你把头撞到墙上就会受伤,就停止敲打它。