【问题标题】:Can't query a string from an SQL table无法从 SQL 表中查询字符串
【发布时间】:2021-07-08 00:34:31
【问题描述】:

当在TComboBox 中选择项目时,我试图将组的值从数据库传递到TEdit。但是,返回的值应该是字符串,而不是整数。在组的文本字段中,返回的值为 0。谁能帮我解决这个问题?

这是文本字段的代码,它应该根据TComboBox 中选择的项目返回组数据:

ADOQuery1.SQL.Clear;
rf := ADOQuery1.SQL.Add('SELECT grouppp FROM f3_sheet WHERE holder =  "' +cb1.Text +'"');
gpp.Text := rf;

【问题讨论】:

    标签: delphi ado tadoquery


    【解决方案1】:

    TADOQuery.SQL 属性是一个TStrings 对象。它的Add() 方法返回您刚刚添加到列表中的字符串的index。这就是为什么在您的示例中返回值是整数0

    但这不是您在这种情况下想要的。根据需要填写SQL语句后,您需要通过调用TADOQuery.Open()方法在数据库上实际执行该SQL,然后您可以从@读取检索到的字段值987654325@收藏,如:

    ADOQuery1.SQL.Text := 'SELECT grouppp FROM f3_sheet WHERE holder = ' + AnsiQuotedStr(cb1.Text, '"');
    ADOQuery1.Open;
    try
      if not ADOQuery1.Eof then
        gpp.Text := ADOQuery1.Fields[0].AsString
      else
        gpp.Text := '';
    finally
      ADOQuery1.Close;
    end;
    

    话虽如此,请注意我如何将您的 SQL 更改为使用 AnsiQuotedStr(),而不是手动将 cb1.Text 用引号括起来。如果允许用户在TComboBox 中输入任意文本,您的原始代码将遭受潜在的SQL 注入攻击

    例如,如果用户要在TComboBox 中输入类似"; DELETE FROM f3_sheet; -- 的内容,您的原始代码最终会执行以下SQL:

    SELECT grouppp FROM f3_sheet WHERE holder = ""; DELETE FROM f3_sheet; --"
    

    您的数据库表的内容将会再见

    TComboBox 设为只读是缓解这种攻击的一种方法,这样只有您的代码才能指定不会破坏 SQL 的有效字符串。

    使用AnsiQuotedStr()是另一种方式,通过转义用户文本中嵌入的引号,例如:

    SELECT grouppp FROM f3_sheet WHERE holder = """; DELETE FROM f3_sheet; --"
    

    现在 SQL 将在 holder 字段中搜索文字字符串 "; DELETE FROM f3_sheet; --,但找不到任何结果。

    但是,避免此类攻击的最佳方法是首先不要手动创建 SQL 语句,而是使用 参数化查询存储过程。例如,上面的例子可以重写为使用这样的参数:

    // make sure to set ADOQuery1.ParamCheeck=true beforehand...
    ADOQuery1.SQL.Text := 'SELECT grouppp FROM f3_sheet WHERE holder = :PHolder';
    ADOQuery1.Parameters.ParamByName('PHolder').Value := cb1.Text;
    ADOQuery1.Open;
    try
      if not ADOQuery1.Eof then
        gpp.Text := ADOQuery1.Fields[0].AsString
      else
        gpp.Text := '';
    finally
      ADOQuery1.Close;
    end;
    

    让数据库为您处理任何引用和转义要求。

    【讨论】:

    • 最好也解释一下 OP 如何使用参数化查询而不是为 SQL 查询构建字符串。
    • @fpiette 这并不是当前问题的真正重点,但是好的,我已经添加了它。
    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 2014-08-09
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多