【问题标题】:Firedac Sqlite Query fails when query string contains "!"当查询字符串包含“!”时,Firedac Sqlite 查询失败
【发布时间】:2021-07-14 15:34:16
【问题描述】:

我正在尝试将记录从另一个数据库加载到 SQLite。我正在使用 Delphi 10.4 (Firemonkey) 和 FireDAC 查询组件。当我将以下查询字符串传递给查询组件时:

INSERT INTO BrandName (BrandName, WebSite, Email) values ("Mount It!", "", "")

它失败并出现以下异常:

Project MigrateData.exe raised exception class ESQLiteNativeException with message '[FireDAC][Phys][SQLite] Error: 2 values for 3 columns'.

当我删除“!”从文件中的记录来看,它会正常处理,如果我在 SQLite DB 浏览器中运行这个查询,它也会正常执行。

我使用的是 sqlite3.dll 版本 3.36。这是我正在使用的代码,以防有帮助:

  with MemDataMod.BrandTable do begin
    First;
    while not EOF do begin
      SQLStr := 'INSERT INTO BrandName (BrandName, WebSite, Email)'
            + ' values ("' + FieldByName('BrandName').AsString + '", "'
            + FieldByName('WebSite').AsString + '", "'
            + FieldByName('Email').AsString + '")';
      MySQLDB.BlankQuery.SQL.Clear;
      MySQLDB.BlankQuery.SQL.Append(SQLStr);
      MySQLDB.BlankQuery.ExecSQL;
      Next;
    end;
  end;

我无法想象为什么“!”会有所作为,但似乎。任何帮助将不胜感激。

【问题讨论】:

    标签: sqlite delphi firedac


    【解决方案1】:

    !(感叹号)字符和其他几个字符需要在 FireDAC SQL 中进行特殊处理,因为它们具有特殊含义。

    这在Preprocessing Command Text (FireDAC) 文档的"Special Character Processing" 部分中有完整记录,请参阅该部分中的 ResourceOptions MacroCreate、MacroExpand、EscapeExpand 属性。

    顺便说一句,通过连接包含用户输入或从中派生的字段值的文本来构造 SQL 是个坏主意,因为它容易受到 SQL Injection Attacks 的攻击。

    【讨论】:

    • 谢谢。我没有意识到特殊处理是 FireDAC 问题。我不担心这个特定实例中的 SQL 注入攻击。该程序是我销售的基于 PC 的产品的数据转换实用程序 - 从一个数据库转换到另一个数据库。这是所有用户的数据,因此没有动机篡改您自己的数据来破坏转换。
    猜你喜欢
    • 2011-03-30
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多