我正在使用C++ Builder(XE7)和FireDAC,试图通过FDConnection.ExecSQL将一行具有GUID数据类型列的表插入到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((param,param,...))

因此,我的下一个尝试是:
FDConnection1->ExecSQL("INSERT INTO SomeTable (Column1, Column2) VALUES ('xyz', :guid)", ARRAYOFCONST(( "{guid {7F60EFE4-106D-4678-A838-8BEB541F2A74}}" )));

失败的原因是:

[bcc32错误] ReportHeaderFrm.cpp(487):E2285找不到与“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}}")));

关于ms-access - 带有Params,C++(或转义GUID大括号)的FireDAC ExecSQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29453550/

10-09 03:38