【发布时间】:2016-12-21 03:29:52
【问题描述】:
那里。我正在尝试通过使用 for 循环将所有字段名添加到 WHERE 子句来搜索包含在 sql 表的任何列中的字符串。我还使用参数来防止 SQL 注入。但是当我运行时,会出现这样的错误:
未指定的错误
如何解决此问题以及问题所在(不一定按此顺序)。这是我的代码。我正在运行 Delphi 7
procedure TfrmView.edtSearchChange(Sender: TObject);
var
i, i2: integer;
obj: TEdit;
QueryText: string;
begin
obj:= Sender as TEdit;
with dmInfo do
begin
qryInfo.SQL.Clear;
qryInfo.SQL.Add('SELECT * FROM ' + tableName);
qryInfo.Open;
tblInfo.SQL.Clear;
tblInfo.SQL.Add('SELECT * FROM ' + tableName);
tblInfo.SQL.Add('WHERE (' + qryInfo.Fields[0].FieldName + ' LIKE :SQuery0)');
QueryText:= '%' + obj.Text + '%';
tblInfo.Parameters.ParamByName('SQuery0').Value:= QueryText;
ShowMessage(QueryText);
ShowMessage(tblInfo.Parameters.ParamByName('SQuery0').Value);
for i:= 1 to qryInfo.FieldCount - 1 do
begin
tblInfo.SQL.Add(' OR (' + qryInfo.Fields[i].FieldName + ' LIKE :SQuery' + IntToStr(i) + ')');
tblInfo.Parameters.ParamByName('SQuery' + IntToStr(i)).Value:= '%' + obj.Text + '%';
end;
tblInfo.Open;
end;
【问题讨论】:
-
你又把
Field.FieldName和Field.Value搞混了。设置参数值时,您希望使用字段的内容,而不是字段的名称。你真的应该学会真正阅读你正在编写的代码。 -
抱歉,我粘贴了错误的代码。昨天想写问题,今天才写。我编辑了问题的代码。与@KenWhite 之前的错误相同
-
在表单上放置一个 TMemo,然后在调用 tblInfo.Open 之前,将 tblInfo.Sql.Text 复制到其中。我怀疑你会看到你的错误。
-
如果我没记错的话,并非您查询的所有列都是文本(您有一些数字列)。您不能在除文本 (CHAR/VARCHAR) 之外的任何数据类型上使用
LIKE。 -
@500-InternalServerError: No. 使用 SQL.Add 在行尾添加一个 CR,因此不会缺少空格。
标签: sql delphi sql-like sql-parametrized-query unspecified