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

Gor*_*ner 1 delphi sqlite firedac

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

INSERT INTO BrandName (BrandName, WebSite, Email) values ("Mount It!", "", "")
Run Code Online (Sandbox Code Playgroud)

它失败,但有以下异常:

Project MigrateData.exe raised exception class ESQLiteNativeException with message '[FireDAC][Phys][SQLite] Error: 2 values for 3 columns'.
Run Code Online (Sandbox Code Playgroud)

当我删除“!” 从文件中的记录来看,它会正常处理,如果我在 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;
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ynA 5

!(惊叹号)字符,和其他几个人,需要FireDAC SQL特殊处理,因为他们有它特殊的含义。

这在预处理命令文本 (FireDAC)文档的“特殊字符处理”部分中有完整记录,请参阅该部分中的 ResourceOptions MacroCreateMacroExpandEscapeExpand属性。

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