[英]Excel VBA connect to remote Oracle DB with InstantClient
我正在嘗試使用Excel(主要是2003,以獲得更多用戶兼容性)來連接到遠程Oracle DB。 我想運行.sql腳本並將數據集返回到工作表。
我在Windows 7 64位機器上。 我不知道Oracle DB服務器的規格。
我想保持盡可能輕量級(在客戶端計算機上沒有額外的文件安裝,盡可能使用共享網絡位置來獲取所需文件)
我將來自Oracle的InstantClient(32位和64位版本12.1和11.2)下載並“安裝”到遠程網絡位置。
我嘗試使用SQL Plus連接到Oracle數據庫並且工作正常(我嘗試了幾個已安裝的InstantClient版本以查看是否存在任何兼容性問題)。
作為測試:在VBA中使用SQL Plus和Shell函數,我能夠成功將數據假脫機到一個單獨的excel文件中。
我使用各種驅動程序/提供程序嘗試了幾種不同的連接字符
我收到的錯誤:
"Run-time error '-2147467259 (80004005)':
[Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_ENV failed
The Oracle(tm) client and networking components were not found. These components are supplied by Oracle Corporation..."
"Run-time error '-2147467259 (80004005)':
[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified"
"Run-time error '3706':
Provider cannot be found. It may not be properly installed"
還有一些其他類似的錯誤。
我已將包含instantclient文件的網絡位置添加到我的PATH環境變量中。 不確定我需要的其他環境變量,或者即使我當前的變量是正確的。
我需要:
TNS_ADMIN? ORACLE_HOME?
如何使用位於網絡(共享)位置的instantclient文件使用VBA連接到遠程Oracle DB ?
什么是正確的完整連接字符串? (我在SQLPlus中使用了EZConnect格式;實際的連接細節是否相同?為了澄清,有人可以發布一個EZConnect格式如何轉換為其他格式的示例嗎?)
My EZConnect Format: username/password@myserver.some.thing.com/mydb
我應該為此目的使用什么“提供者”或“驅動程序”,是否存在重大差異?
我發現了許多類似或相關的問題,但沒有一個直接回答我的問題或幫助我完全解決它。
結束編輯/使用此功能(不使用(?)使用驅動程序/提供程序: InstantClient但仍使用這些文件):
Function ORAQUERY(strHost As String, strDatabase As String, strSQL As String, strUser As String, strPassword As String)
Dim strConOracle, oConOracle, oRsOracle
Dim StrResult As String
StrResult = ""
strConOracle = "Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=" & strHost & ")(PORT=1521))" & _
"(CONNECT_DATA=(SERVICE_NAME=" & strDatabase & "))); uid=" & strUser & " ;pwd=" & strPassword & ";"
Set oConOracle = CreateObject("ADODB.Connection")
Set oRsOracle = CreateObject("ADODB.Recordset")
oConOracle.Open strConOracle
Set oRsOracle = oConOracle.Execute(strSQL)
MsgBox (oRsOracle.Fields(0).Value)
varResult = oRsOracle.GetRows
Do While Not oRsOracle.EOF
If StrResult <> "" Then
StrResult = StrResult & Chr(10) & oRsOracle.Fields(0).Value
Else
StrResult = oRsOracle.Fields(0).Value
End If
oRsOracle.MoveNext
Loop
oConOracle.Close
Set oRsOracle = Nothing
Set oConOracle = Nothing
ORAQUERY = StrResult
End Function
正確的完整連接字符串:
Driver={Microsoft ODBC for Oracle}; CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=strHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=strDatabase))); uid=strUser; pwd=strPassword;
提供者或司機:
{Microsoft ODBC for Oracle}
需要將PATH環境變量設置為指向instantclient。
沒有使用任何其他環境變量,例如ORACLE_HOME,TNS_ADMIN等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.