2016-06-27 4 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); 

Я был supsicious, что [headr] была проблема, что, возможно, это было какое-то макрос, который расширяется только в среде Access. Поэтому я пробовал некоторые другие операторы SQL, как тест, и всегда получал ту же синтаксическую ошибку в предложении FROM.

Я попытался

ВЫБОР MSysObjects.Name КАК table_name ОТ MSysObjects;

SELECT * FROM MSysObjects WHERE Тип = 1 И Флаги = 0;

SELECT 'ASDF' AS TEST FROM DUAL;

Все те же ошибки.

Любые идеи? Спасибо!

+0

Что такое источник данных 'test.aaf'? Базы данных доступа заканчиваются на .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.