我的环境是 Windows 10、Office 2019 - 64 位 Oracle 客户端 19.3。多年来,我一直使用 Office Macro 访问 Oracle 数据。最近,Oracle 服务器从版本 11.g 升级到了 18.c。宏可以在大多数 PC 上运行,但在少数 PC 上我在登录 Oracle 时遇到间歇性问题。我想知道是不是因为 Oracle 现在有了“容器”的概念。在 Oracle 的 SQL Plus 中,它被称为“服务名称”。如果我使用“系统”的用户 ID 执行下面的代码,我会登录,但看不到我需要的容器 (XEPDB1) 中的表。如果我使用在 XEPDB1 容器中创建的用户 ID 和密码登录,我会收到一条错误消息,告诉我我的用户 ID/密码组合无效。
有没有办法在我登录时使用 ADODB 并指定容器/服务名称,以避免登录错误?这是我用来登录的代码片段。
Option Explicit
Sub ReadFromOracle()
'DECLARE VARIABLES
Dim objConnection As ADODB.Connection
Dim objRecordset As ADODB.Recordset
Dim strConnection As String
Dim strSQL As String
Dim lngRecordCount As Long
On Error GoTo ErrorHandler
Set objConnection = New ADODB.Connection
Set objRecordset = New ADODB.Recordset
strConnection = "Provider=MSDASQL.1;" & _
"Persist Security Info=False;" & _
"Data Source=MyServer1;" & _
"UID=My_XEPDB1_UserID;" & _
"Password=My_XEPDB1_Password"
strConnection = "Provider=MSDASQL.1;" & _
"Persist Security Info=False;" & _
"Data Source=MyServer1;" & _
"UID=system;" & _
"Password=My_System_Password"
objConnection.ConnectionString = strConnection
'Open the database connection
objConnection.Open
strSQL = "Select title from LIB_BOOK where book_pk = 1;"
'Close objRecordset if it was open.
If CBool(objRecordset.State And adStateOpen) = True Then
objRecordset.Close
End If
objRecordset.CursorLocation = adUseClient
objRecordset.Open strSQL, objConnection
lngRecordCount = objRecordset.RecordCount
Exunt:
'Set objects to nothing
'Close objRecordSet
If CBool(objRecordset.State And adStateOpen) = True Then objRecordset.Close
Set objRecordset = Nothing
Set objConnection = Nothing
Exit Sub
ErrorHandler:
'Display the error message
'lngUpdateReturn = Err.Number
Select Case Err.Number
Case Is = -2147217843
MsgBox "Detailed Error Message for -2147217843.", vbCritical
Case Is = -2147467259
MsgBox "Detailed Error Message for -2147467259.", vbCritical
Case Else
MsgBox "Error Number : " & Err.Number & vbNewLine & vbNewLine & _
"Error Source: " & Err.Source & vbNewLine & vbNewLine & _
"Error Message : " & Err.Description & vbNewLine & vbNewLine, _
vbCritical
End Select
GoTo Exunt
End Sub
TNSNAMES.ORA 文件的一个子集是:
# tnsnames.ora Network Configuration File: C:\app\product\18.0.0\dbhomeXE\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
MyServer1 =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = MyHost.MyDomain.com)
(PORT = 1521)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XEPDB1)
)
)