使用VBA中的DAO Database对象与Oracle数据库建立DSNless连接

问题描述 投票:0回答:1

可以使用DSN减少与从VBA中的DAO Database类创建的对象的连接。

使用ODBC连接与数据库的连接按预期工作,但是如果您使用其他连接字符串类型,如www.connectionstrings.com所述,则不会建立连接。

public Sub dbConnectTest()

Dim myDB As DAO.Database
Dim conn As String
Dim tns As String
Dim odbcString as String

odbcString = "ODBC;DSN=Location Name;UID=ANUSER;PWD=apassword;DBQ=A_TNS_NAME"

' this part works
   Set myWorkspace = DBEngine.CreateWorkspace("APPNAME", "admin", "")
   Set myDB = myWorkspace.OpenDatabase(Name:="", Options:=dbDriverNoPrompt, ReadOnly:=True, _
                                                        Connect:=odbcString)
 ' same here                                                        
    Set myDB = OpenDatabase("", False, False, "ODBC")                                                       
' any of below part don't work

 odbcString = "Driver=(Oracle in XEClient);dbq=server:1980/SID;UID=ANUSER;PWD=apassword;"
 odbcString = "Driver={Oracle in OraHome92};Dbq=A_TNS_NAME;UID=ANUSER;PWD=apassword;"
 odbcString = "Driver={Microsoft ODBC for Oracle};CONNECTSTRING=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1980)))(CONNECT_DATA=(SERVICE_NAME=SID)));Uid=ANUSER;Pwd=apassword;"
     Set myDB = OpenDatabase("", False, False, odbcString)                                                      



end sub

我想更改连接字符串,因为即使在用户注销后myDB对象设置为空,当使用新密码请求新登录时,旧连接字符串以某种方式保留,而不是成功连接错误连接对象被重新获得。

问候,

vba oracle odbc database-connection
1个回答
0
投票

我能够使用以下连接字符串连接到Oracle 11g实例并调用OpenDatabase。我正在使用通过引用“Microsoft Office 16.0 Access数据库引擎对象”提供的DAO版本:

' Construct connection string
oracxnstr = "Driver={Microsoft ODBC for Oracle};Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=fake.url.com)(PORT=fakePortNo))(CONNECT_DATA=(SID=fakeSID)));Uid=fakeUid;Pwd=fakePw;"

我显然在这个字符串中使用了伪参数,所以我没有暴露我的数据库。

' attempt to connect to oracle
Set oradb = dbws.OpenDatabase("", 1, True, oracxnstr)

Microsoft DAO文档严重不足,因此我指出了我的代码与您的代码之间的差异:

  • 我正在使用连接字符串参数“Server”而不是“CONNECTSTRING”。但是,任何一个都在我的系统中工作。
  • 我正在使用连接字符串参数“SID”而不是“SERVICE_NAME”。这也没有什么区别......这一次。但由于我不明白的原因,我知道它在过去有所作为。我不明白为什么它确实有所作为。 (我是Oracle新手,但我认为Oracle配置与它有关。)
  • 对于OpenDatabase方法的第二个参数,我使用的是1而不是true。这是dbDriverNotPrompt枚举常量。如果我改为真,这也没有什么区别。
  • 如果我使用DAO 3.6我得到一个运行时错误3151“ODBC连接失败。”我想知道旧版本是否无法处理到Oracle的DSN-less或TNS-less连接字符串?

我能想到的唯一区别是,您的Oracle用户名/密码帐户可能具有只读权限,而OpenDatabase方法的第3个参数设置为false?

© www.soinside.com 2019 - 2024. All rights reserved.