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 文档说要通过加倍来转义像“{”这样的特殊字符。
所以,我的下一次尝试:
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}}")));
我正在使用 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 文档说要通过加倍来转义像“{”这样的特殊字符。
所以,我的下一次尝试:
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}}")));