2016-06-27 51 views
1

我有一個用VBA編寫並在MS Access內運行的現有程序。出於各種原因,我們希望將其從Access中取出並製作一個獨立的程序。ADO Jet SQL引發「FROM子句中的語法錯誤」始終

因此我將VBA移植到C++。下面的代碼在VBA工作

Dim DataFile As New ADODB.Connection 
Dim rstSrc As New ADODB.Recordset 
DataFile.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.aaf;" 
rstSrc.Open "SELECT * FROM [Headr];", DataFile, adOpenStatic, adLockReadOnly 

我的代碼到C++下面的端口不起作用。它每次都會給出錯誤「FROM子句中的語法錯誤」。

_RecordsetPtr RS("ADODB.Recordset"); 
_ConnectionPtr CON("ADODB.Connection"); 
CON->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.aaf;","","",adConnectUnspecified); 
RS->PutRefActiveConnection(CON); 
RS->Open("SELECT * FROM [Headr];",vtMissing,adOpenStatic,adLockReadOnly,adCmdTable); 

我當時覺得[headr]是個問題,也許這是某種僅在Access環境中擴展的宏。所以我嘗試了一些其他的SQL語句作爲測試,並且總是在FROM子句中得到相同的語法錯誤。

我試圖

SELECT MSysObjects.Name AS TABLE_NAME FROM MSysObjects;

SELECT * FROM MSysObjects WHERE Type = 1 AND Flags = 0;

SELECT'ASDF'as DEST FROM DUAL;

所有這些都給出了同樣的錯誤。

任何想法? 謝謝!

+0

什麼是數據源'test.aaf'? Access數據庫以.mdb或.accdb結尾,並需要數據源引用中的完整路徑。如果這是另一個數據源,請確保您的SQL語法符合它。 – Parfait

回答

0

我通過添加一個Command對象來執行SELECT查詢來解決問題。以下代碼有效;

_RecordsetPtr RS("ADODB.Recordset"); 
_ConnectionPtr CON("ADODB.Connection"); 
_CommandPtr CMD("ADODB.Command"); 
CON->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.aaf;","","",adConnectUnspecified); 
CMD->ActiveConnection = CON; 
CMD->CommandText = "SELECT * FROM [Headr];"; 
RS = CMD->Execute(NULL,NULL,0); 

這和我之前做的事情根本沒有區別。他們應該同樣工作,只是略有不同的語義。但實際上這是有效的,前者不起作用。所以我認爲這是Jet OBDC驅動程序中的一個錯誤。