2016-06-27 26 views
1

Ich habe ein vorhandenes Programm, das in VBA geschrieben wird und in MS Access ausgeführt wird. Aus verschiedenen Gründen möchten wir es aus Access herausnehmen und ein eigenständiges Programm erstellen.ADO Jet SQL löst "Syntaxfehler in FROM-Klausel" aus Immer

So portiere ich VBA zu C++. Der folgende Code funktioniert in 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 

Mein Port des Codes nach C++ unten funktioniert nicht. Es gibt Fehler "Syntax Error in FROM-Klausel" jedes Mal.

_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); 

Ich war supsicious, dass die [HEADR] das Problem war, dass vielleicht, dass eine Art von Makro war, die nur in der Access-Umgebung erweitert. Also habe ich einige andere SQL-Anweisungen nur als Test ausprobiert und immer denselben Syntax Error in der FROM-Klausel bekommen.

Ich versuchte

SELECT MSysObjects.Name AS table_name FROM MSysObjects;

SELECT * FROM MSysObjects WHERE Typ = 1 UND Flags = 0;

WÄHLEN SIE 'ASDF' ALS TEST VON DUAL;

Alle diese gaben den gleichen Fehler.

Irgendwelche Ideen? Danke!

+0

Was ist die Datenquelle 'test.aaf'? Access-Datenbanken enden entweder in .mdb oder .accdb und erfordern den vollständigen Pfad in der Datenquellenreferenz. Wenn dies eine andere Datenquelle ist, vergewissern Sie sich, dass Ihre SQL-Syntax sich daran hält. – Parfait

Antwort

0

Ich löste das Problem durch Hinzufügen eines Befehlsobjekts, um die SELECT-Abfrage auszuführen. Der folgende Code funktioniert;

_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); 

Es gibt grundsätzlich keinen Unterschied zwischen dem und dem, was ich vorher gemacht habe. Sie sollten beide gleich gut funktionieren, nur eine etwas andere Semantik. Aber in der Realität funktioniert das und das erste funktioniert nicht. Also ich denke es ist ein Fehler im Jet OBDC Treiber.