我正在使用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文檔在這裏表示通過將特殊字符「加倍」來避開特殊字符。
所以,我的下一個嘗試:
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)'
我走了的想法。任何幫助?
嘗試設置'ResourceOptions.EscapeExpand'爲false可以處理''{嗯 – crefird 2015-04-05 02:55:28
停止FireDAC,這是地方'PARAMS [] .AsGUID'可能會失敗。 – TLama 2015-04-05 08:32:12
您是否嘗試過直接格式化字符串: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