2015-04-05 99 views
3

我正在使用C++ Builder(XE7)和FireDAC,嘗試將一行GUID數據類型的表插入帶有FDConnection的Microsoft Access數據庫.ExecSQL。FireDAC ExecSQL與Params,C++(或轉義GUID大括號)

SQL這在任何工具,它可以讓我直接執行SQL的數據庫工程:

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

(以上GUID語法顯然是微軟想要什麼,這個奇怪的數據庫列型)

所以,試圖在我的程序執行該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方法與簽名,讓路過PARAMS超載,所以我想這:

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

但是這個簡單的[參數,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 Error] ReportHeaderFrm.cpp(487): E2285 Could not find a match for 'TFDCustomConnection::ExecSQL(UnicodeString,OpenArray,unsigned int)'

我走了的想法。任何幫助?

+2

嘗試設置'ResourceOptions.EscapeExpand'爲false可以處理''{嗯 – crefird 2015-04-05 02:55:28

+0

停止FireDAC,這是地方'PARAMS [] .AsGUID'可能會失敗。 – TLama 2015-04-05 08:32:12

+0

您是否嘗試過直接格式化字符串:UnicodeString sql = Format(「INSERT INTO SomeTable(Column1,Column2)VALUES('%s',{guid%s}」,ARRAYOFCONST((「xyz」,「{7F60EFE4-106D -4678-A838-8BEB541F2A74}「)));'然後調用'FDConnection1-> ExecSQL(sql);'? – 2015-04-06 16:13:16

回答

2

要調用這種功能,您需要宏OPENARRAY,而不是ARRAYOFCONST。因此,改變你的最後一次嘗試這個應該通過編譯器錯誤:

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

完美的作品。謝謝! – scribe 2015-04-06 18:30:47