【问题标题】:Unspecified Error when search a table for a string in sql delphi using parameters - Delphi SQL使用参数在 sql delphi 中搜索表中的字符串时出现未指定的错误 - Delphi SQL
【发布时间】: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.FieldNameField.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


【解决方案1】:

整个代码毫无意义。

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

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

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

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

首先将代码从onChange事件中移除

你想用这段代码做什么
tblInfo 中搜索所有字段的值 可以不用第一个表qryInfo

您不需要增加参数。

不要一直创建从SQuery1SQuery100 的参数

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

这将一次性用值替换所有参数: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 个条件,并且没有用户将提供 比那个/人记录不会超过一个满足 这么多条件。

【讨论】:

  • 你了解Parameters 对象的工作原理吗?
  • 我知道它在查询中的任何位置都无法正常工作。还在 (int) 字段上使用带引号的值。我还发现您不能将 :xyzParam 放在查询中的任何位置。过去我有很多问题,直到我发现我可以使用最像 WHERE member_name = :xyzparam 这样的参数,这是一个好地方。
  • DV 已删除。这个答案现在很有帮助并且更相关。如果 OP 实现了你的建议,那肯定是一个改进;虽然目前尚不清楚这是否会解决他的具体问题。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多