如果 .sql 文件中的第一行是注释,VBA ADOBD.Recordset 将不会打开

VBA ADOBD.Recordset won't open if first line in .sql file is a comment

我在 Excel 到 运行 .sql 文件中有一个宏连接到 Oracle 以提取数据。我的问题是如果 .sql 文件的第一行是注释行,我有一个非常奇怪的 "bug"。

如果只有--或者整个注释行都在select之后,它会起作用,但是如果第一行--之后有东西,它不会工作。 (这与 /**/ 相同。不能在 /* 和 */ 之间放置任何东西,否则它不会起作用)。

下面是 .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é."

我希望我提供了解决此问题所需的所有信息。谢谢。

终于发现问题是 ADODB.Recordset 只接受以 SELECT 开头的查询。如果它以其他任何内容开头,它会将其视为表名或类似名称。

所以解决方案是将它嵌套在 "select * from (YOURQUERYHERE)".

感谢 René Nyffenegger 在这里回答 Why can't I do a "with x as (...)" with ADODB and Oracle?