使用VBA中的DAO数据库对象与Oracle数据库进行DSNless连接

时间:2018-12-11 14:47:25

标签: vba oracle odbc database-connection

可以将DSNless连接与从VBA中的DAO数据库类创建的对象一起使用。

使用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对象设置为空,当使用新密码请求新登录时,仍会保留旧的连接字符串而不是连接错误,检索成功的连接对象。

此致

1 个答案:

答案 0 :(得分: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枚举的常量。如果我更改为true,这也没有任何区别。
  • 如果我使用DAO 3.6,我会执行操作,并收到运行时错误3151“ ODBC连接失败”。我想知道旧版本是否无法处理到Oracle的少DSN或少TNS的连接字符串?

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