0

there. I am trying to search for a string contained in any column of a sql table by adding all the Fieldnames to the WHERE clause using a for loop. Also I use parameters to protect against SQL injection. But when I run I get an error like this:

Unspecified error

How can this be fixed and what is the problem (Not necessarily in that order). Here is my code. I am running 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;
4

1 回答 1

-1

整个代码毫无意义。

  • 每次更改字母时都让代码运行。由 onChange 事件运行
  • edtSe​​arch 输入字段的五个输入/字母表示代码立即执行五次而不会中断
  • 如果一次性删除 edtSe​​arch 输入字段中的所有内容,这也是一个更改事件。这次它运行一个的edtSe​​arch.text
  • 你怎么能指望这能毫无例外地工作
  • 您每次打开两张桌子之前都没有关闭它们。
  • 您正在使用一个变量,这表明该事件也连接到其他 TEdits。

    对象:TEdit;
    obj:= 作为 TEdit 的发件人;

  • 您清除打开的表上的 SQL。

  • 你有两个表,第一个只是 SQL.clear 和 open
  • 您正在使用第一个表中的字段并为第二个表创建 SQL
  • 即使两个表相同,使用第一个表中的字段也没有任何意义。
    这是令人困惑、误导和不必要的。

首先从 onChange 事件中删除代码

你想用这个代码
来搜索所有字段的值tblInfo 可以在没有第一个表的情况下完成qryInfo

您不需要增加参数。

不要一直创建参数从SQuery1到可能SQuery100

如果您只使用一个参数(搜索值始终相同)您可以在循环之前 但不在循环中
使用一次设置所有参数。tblInfo.Parameters.ParamByName()tblInfo.Open

这将用:SQuery值一次全部替换所有参数

SQL.文本:

SELECT * FROM tableName
WHERE (IDmember LIKE :SQuery)
OR (memberName LIKE :SQuery)
OR (petName LIKE :SQuery)
OR (Address LIKE :SQuery)

SQL 语句的最大长度

因数据库而异

我可以在 MySql 查询的单个 WHERE 条件中使用多少个 OR 子句?

我知道过去是有限制的。但是现在专家的知识不一样了

只有一种意见

事实是,它受限于数据库上的可用资源、相关数据集的大小、正在处理的索引(或缺少索引)以及每个子句的复杂性。

如果您的目标是找到满足多个条件的人员记录,我敢打赌您不会遇到限制。您可以轻松地使用 20 到 30 个条件进行 OR 条件,并且没有用户会提供更多的 / 个人记录不会有超过一个满足这么多条件的条件。

于 2016-08-15T06:03:08.987 回答