ADO Jet SQL总是引发“FROM子句中的语法错误”

时间:2016-06-27 16:14:46

标签: c++ vba ado porting

我有一个用VBA编写并在MS Access中运行的现有程序。出于各种原因,我们希望将其从Access中取出并制作一个独立的程序。

因此我将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;

选择'ASDF'作为双重测试;

所有这些都给出了同样的错误。

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分: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驱动程序中的一个错误。