2010-02-23 31 views
8

我無法通過ADODB和Oracle執行帶有條款的SQL查詢。爲什麼我不能用ADODB和Oracle做「用x作爲(...)」?

也就是說,下面的代碼片段工作:

Dim cn As ADODB.connection 
Set cn = .... 

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

rs.Open "select 'foo' x from dual", cn 


Do While Not rs.eof 
    ... 
    rs.MoveNext 
Loop 

但是,下列不工作 - 它genererats一個運行時錯誤3704:當對象被關閉的操作是不允許的。

Dim cn As ADODB.connection 
Set cn = .... 

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

rs.Open "with w as (select 'foo' x from dual) select x from w", cn 

Do While Not rs.eof 
    ... 
    rs.MoveNext 
Loop 

很顯然,這是由一個更復雜的查詢 現實問題的一個精簡的示範。

在我看來,ADODB種類的查詢在將查詢傳遞給Oracle實例之前解析,並且不瞭解的條款。無論如何,在這方面的任何幫助是高度讚賞 。

回答

16

好吧,它真的好像ADODB預計查詢語句實際上以select開始。 因此,對這個問題的解決辦法可能是附上的聲明中select * from (....)像這樣:

Dim sql As String 
sql = "with w as (select 'foo' x from dual) select x from w" 

' enclose the statement: 
sql = "select * from (" & sql & ")" 

rs.Open sql, cn 
+0

Ohhhhhhhhhhhhhhh人認爲的要救我大量的工作!我在ADODB中寫了很多Oracle查詢,並一直避免使用WITH語句。這將提供更多的清晰度。如果可以的話,我會投這個票數百次。 – 2012-01-12 02:29:55

+3

我不知道該說些什麼。這對MS來說太愚蠢了。一個嚴重的WTF。 – RAY 2014-10-06 08:46:37

+0

謝謝你的回答,它真的幫了我。 – tuj 2017-03-24 20:41:52

1

以上方法並沒有爲我工作。

添加「;」 WITH關鍵字之前解決了問題。

昏暗的SQL作爲字符串 SQL = 「;以w作爲選擇x從(選擇 '富' 從雙X)W」

rs.Open SQL,CN

+0

不適用於我。得到「無效字符」。 – RAY 2014-10-06 08:51:17

+0

按廣告製作。 – primo 2016-02-04 03:48:33

相關問題