VBA ADOBD.Recordset не открывается, если первая строка в. sql файле является комментарием - PullRequest
0 голосов
/ 17 января 2020

У меня есть макрос в Excel для запуска. sql файлы, соединяющиеся с Oracle для извлечения данных. Моя проблема в том, что у меня очень странная ошибка, связанная с тем, что первая строка файла. sql является строкой комментария.

Если есть только -- или вся строка комментария после выберите, он будет работать, но если после первой строки -- что-то будет, это не сработает. (Это то же самое, что и /**/. Невозможно поместить что-то между / * и * /, иначе это не сработает).

Вот несколько примеров. sql:

Пример 1 (не работает):

-- test
select 
* 
from ABC.ABC_FIELD ABCField 
where what_ever = 15

Пример 2 (работает):

--
select 
* 
from ABC.ABC_FIELD ABCField 
where what_ever = 15

Пример 3 (работает):

select 
-- test
* 
from ABC.ABC_FIELD ABCField 
where what_ever = 15

Вот код VBA, который может иметь отношение к делу. Кажется, что он не работает в строке rs.Open (rs не открывается вообще), но я не получаю ошибки. Таким образом, rs.Fields.Count равно 0, что делает попытку чтения записей после этого неудачной.

Public cnn As ADODB.Connection

...

Set cnn = New ADODB.Connection
        cnn.ConnectionString = "DSN=ABC_ORA;UID=" & UserId & ";PWD=" & Password & ";Persist Security Info=true"
cnn.Open

...

Dim myFile As String
Dim text As String
Dim textline As String

LaRequete = ""

myFile = Application.Worksheets(FeuilleParametres).Range("FICHIER").Value

Open myFile For Input As #1

Do Until EOF(1)
    Line Input #1, textline
    LaRequete = LaRequete & textline & " " & vbCrLf
Loop
Close #1

...

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

rs.Open LaRequete, cnn.ConnectionString 

For iCols = 0 To rs.Fields.Count - 1
    resultatsSheet.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next

Вот две ошибки, которые я получаю в ADODB.Connection. Извините, описания на французском.

Error 1
Native Error: 0 
Number : -2147217887
Source : "Microsoft OLE DB Provider for ODBC Drivers"
Description : "Une opération OLE-DB en plusieurs étapes a généré des erreurs. Vérifiez chaque valeur d'état OLE-DB disponible. Aucun travail n'a été effectué."

Error 2
Help Context : 1240640
Native Error : -2147217887
Number : -2147217887
Source : "ADODB.Connection"
Description : "Le fournisseur ne prend pas en charge cette propriété."

Я надеюсь, что предоставил всю необходимую информацию для решения этой проблемы. Спасибо.

1 Ответ

0 голосов
/ 24 января 2020

Наконец выяснилось, что проблема в том, что ADODB.Recordset принимает только те запросы, которые начинаются с SELECT. Если он начинается с чего-то еще, он будет рассматривать его как имя таблицы или что-то в этом роде.

Таким образом, решение заключается в том, чтобы поместить его в «select * from (YOURQUERYHERE)».

Спасибо Рене Найффенегеру, который ответил здесь Почему я не могу сделать "с x как (...)" с ADODB и Oracle?

...