如果 .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?
我在 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?