我有一个用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'作为双重测试;
所有这些都给出了同样的错误。
有什么想法吗? 谢谢!
答案 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驱动程序中的一个错误。