FireDAC ExecSQL with Params, C++ (or escape GUID braces)

FireDAC ExecSQL with Params, C++ (or escape GUID braces)

我正在使用 C++Builder (XE7) 和 FireDAC,试图在 table 中插入一行数据类型为 GUID 的列到 FDConnection.ExecSQL 的 Microsoft Access 数据库中。

SQL 适用于任何允许我直接对数据库执行 SQL 的工具:

INSERT INTO SomeTable (Column1, Column2) 
VALUES ('xyz', {guid {7F60EFE4-106D-4678-A838-8BEB541F2A74}})

(上面的 GUID 语法显然是 Microsoft 想要的这种奇怪的数据库列类型)

因此,尝试在我的程序中执行此 SQL...

我的第一次尝试:

FDConnection1->ExecSQL("INSERT INTO SomeTable (Column1, Column2) VALUES ('xyz', {guid {7F60EFE4-106D-4678-A838-8BEB541F2A74}})");

失败,因为在 FireDAC 预处理中显然使用了大括号“{”、“}”(我从来不知道,但看起来很有用)。这里的 FireDAC 文档说要通过加倍来转义像“{”这样的特殊字符。

文档:http://docwiki.embarcadero.com/RADStudio/XE7/en/Preprocessing_Command_Text_%28FireDAC%29#Special_Character_Processing

所以,我的下一次尝试:

FDConnection1->ExecSQL("INSERT INTO SomeTable (Column1, Column2) VALUES ('xyz', {{guid {{7F60EFE4-106D-4678-A838-8BEB541F2A74}}}})");

还是不行。因宏预处理器错误而失败。

最后,看起来 ExecSQL 方法重载了一个允许传递参数的签名,所以我尝试了这个:

FDConnection1->ExecSQL("INSERT INTO SomeTable (Column1, Column2) VALUES ('xyz', :guid)", ["{guid {7F60EFE4-106D-4678-A838-8BEB541F2A74}}"]);

但是示例中给出的这种简单 [param, param, ... ] 语法是 Delphi,而不是 C++。没有 C++ 示例。

经过一些研究,我发现有一个宏可能有助于在 C++ 中处理这些类型的方法签名。它的语法是: ARRAYOFCONST((参数,参数,...))

所以,我的下一次尝试是:

FDConnection1->ExecSQL("INSERT INTO SomeTable (Column1, Column2) VALUES ('xyz', :guid)", ARRAYOFCONST(( "{guid {7F60EFE4-106D-4678-A838-8BEB541F2A74}}" )));

失败:

[bcc32 Error] ReportHeaderFrm.cpp(487): E2285 Could not find a match for 'TFDCustomConnection::ExecSQL(UnicodeString,OpenArray,unsigned int)'

我没主意了。有帮助吗?

要调用此类函数,您需要宏 OPENARRAY,而不是 ARRAYOFCONST。因此,更改您为此所做的最后一次尝试应该会通过编译器错误:

FDConnection1->ExecSQL("INSERT INTO SomeTable (Column1, Column2) VALUES (:param1, :param2)", OPENARRAY(Variant, ("xyz", "{guid {7F60EFE4-106D-4678-A838-8BEB541F2A74}}")));