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
而不是 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;
我从来不知道字符串类型查询参数需要数据类型或任何设置,我会简单地删除对该数据类型的任何引用。
毕竟,如果用头撞墙会痛,那就别再撞了。
我只是学习使用参数化查询的初学者,因为我以前做过很多连接。我一直在尝试使下面的查询正常工作。它是一个简单的 '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
而不是 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;
我从来不知道字符串类型查询参数需要数据类型或任何设置,我会简单地删除对该数据类型的任何引用。
毕竟,如果用头撞墙会痛,那就别再撞了。