我只是一个学习使用参数化查询的初学者,因为我之前做了很多连接。我一直试图让下面的查询工作。这是一本简单的书#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字段中,我想应用我的查询。
答案 0 :(得分:2)
注意:此答案是根据问题中的原始代码发布的,该代码已经过编辑以符合我的答案。有关我的答案所基于的问题的第一个版本,请参阅问题revision history。
你在另一篇文章中看到的解决方案是正确的;它仅适用于标准TQuery
而非TADOQuery
。 TADOQuery
需要进行一些小的语法更改:
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)
我从来不知道字符串类型查询参数需要数据类型或任何设置,我只是删除对数据类型的任何引用。
毕竟,如果你把头撞到墙上就会受伤,就停止敲打它。