首页 > 解决方案 > 如果 .sql 文件中的第一行是注释,则 VBA ADOBD.Recordset 将不会打开

问题描述

我在 Excel 中有一个宏来运行连接到 Oracle 以提取数据的 .sql 文件。我的问题是我有一个非常奇怪的“错误”,基于 .sql 文件的第一行是否是注释行。

如果选择后只有 the--或整个注释行,它会起作用,但如果--第一行的后面有东西,它将不起作用。(这与 . 的处理相同/**/。不能在 /* 和 */ 之间放置一些东西,否则它将不起作用)。

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

我希望我提供了所有需要的信息来解决这个问题。谢谢。

标签: sqlvbaoraclecommon-table-expressionrecordset

解决方案


最后发现问题在于 ADODB.Recordset 只接受以 SELECT 开头的查询。如果它以其他任何东西开头,它将把它视为一个表名或类似的东西。

所以解决方案是将其嵌套在“select * from (YOURQUERYHERE)”中。

感谢 René Nyffenegger 在这里回答了为什么我不能用 ADODB 和 Oracle 做一个“with x as (...)”?


推荐阅读