当查询字符串包含“!”时,Firedac Sqlite 查询失败

Firedac Sqlite Query fails when query string contains "!"

我正在尝试将记录从另一个数据库加载到 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 数据库浏览器中执行此查询,它也会正常执行。

我正在使用 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;

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

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

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

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

的攻击