2013-10-24 54 views
5

我在使用Oracle OraOLEDB.Oracle Provider在Excel 2010 VBA代碼中運行查詢時遇到問題。Excel中的Oracle和ADO查詢不返回結果

某些查詢做工精細,並返回結果,而另一些返回任何結果...

我連這樣:

Set DBConnection = New ADODB.Connection 
    DBConnection.Provider = "OraOLEDB.Oracle" 
    DBConnection.CursorLocation = adUseClient 
    DBConnection.ConnectionString = "Data Source=" & TNSName & ";User Id=" & OraUserName & ";Password=" & OraPassWord & ";" 
    DBConnection.Open 

我再嘗試查詢:

command2.ActiveConnection = DBConnection 
command2.CommandText = "SELECT COL1,COL2,COL3 FROM table(MySchema.MyPackage.MyFunction('Param1'))" 
command2.CommandType = adCmdText 

Set QueryRecordSet = New ADODB.Recordset 
QueryRecordSet.LockType = adLockReadOnly 
QueryRecordSet.CursorType = adOpenDynamic 
QueryRecordSet.Open command2 


command2.Execute 

和我什麼也沒有得到任何想法?

如果我運行像

select * From my_table 

它工作正常的簡單查詢...看來連接或其它更復雜的查詢,不進行編譯?

此外,從視圖中選擇不起作用。

select * from my_view 

返回Nothing

+0

我想我也應該注意到這些函數都在一個包中。 – mrkb80

+0

我也遇到過很多關於CTE(有聲明)不能與ADO一起工作的文章。從ADO專家那裏聽到這裏會發生什麼,聽起來不是簡單地傳遞給數據庫,這真是太棒了! ADO試圖解析這個查詢是什麼?爲什麼它默默地失敗? – mrkb80

+0

你嘗試過'DBConnection.CursorLocation = adUseServer'嗎? – ThinkJet

回答

2

我把這個作爲一個答案,只是因爲評論格式不允許我添加代碼。

如果通過命令對象單獨運行存儲過程,該存儲過程是否可以正常工作?

command2.CommandText = "MySchema.MyPackage.MyFunction" 
command2.CommandType = adCmdStoredProc 
command2.Parameters.Refresh 
command2.Parameters.Item(1).Value = "Param1" 
command2.Execute 
Debug.Print command2.Parameters.Item(0).Value 
1

我不確定這是你在找什麼。我正在尋找另一個答案,我知道這對我有用。

Set cmdSum = New adodb.Command 

With cmdSum 
    Set .ActiveConnection = oCon 
    .Properties("PLSQLRSet") = True 
    .CommandText = "{CALL StoredProc(?,?)}" 
    .CommandType = adCmdText 
    .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 10, Format(CDate(sTerm), "mm/dd/yyyy")) 
    .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 10, Format(CDate(sEff), "mm/dd/yyyy")) 
End With 

Set Rs = cmdSum.Execute() 

For c = 0 To Rs.Fields.Count - 1 
    Wk.Cells(3, c + 1) = Rs.Fields(c).Name 
Next c 
0

我在這裏結束後,對ADO查詢到Oracle不起作用。

雖然它在問題的評論中說明您可以使用ODBC來解決此問題,但我花了一段時間才弄清楚如何獲取ODBC連接字符串的工作方式。

這是一個與Oracle合作的ODBC連接。

dbConn = "ODBC;Provider=OraOLEDB.Oracle;" & _ 
     "Data Source=odbc_connection_name;" & _ 
     "User Id=user_id;" & _ 
     "Password=user_pwd;" & _ 
     "DBQ=tns_name;" 

tns_name是你指定的tnsnames.ora文件中的連接。

odbc_connection_name是您命名您的odbc連接。

然後,你可以使用這個使用ADO連接到Oracle像正常:

cn.Open dbConn 
cn.CommandTimeout = 1000 
rs.Open sql, cn 

注意我也不得不加大CommandTimeout屬性,ODBC的默認的超時時間是比較短的。