2016-06-27 53 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驱动程序中的一个错误。