Classic ADO / ODBC / Oracle 10g EZConnect 的连接字符串语法

Posted

技术标签:

【中文标题】Classic ADO / ODBC / Oracle 10g EZConnect 的连接字符串语法【英文标题】:Connection string syntax for Classic ADO / ODBC / Oracle 10g EZConnect 【发布时间】:2011-03-24 19:39:55 【问题描述】:

我正在尝试使用 ADO (2.8) 而没有 TNS 将各种 VBA 项目连接到 Oracle 10g 后端。经过各种尝试,我们决定干净安装的最简单的一系列步骤包括:

    设置 Oracle Instant Client 安装随附的 ODBC 驱动程序 (通过 SQL Plus 使用 EZCONNECT 测试连接) (通过创建 Windows DSN 测试连接)

到目前为止一切正常。问题是,我无法弄清楚告诉 ADO 使用 instant client ODBC 驱动程序的语法,该驱动程序在我的 ODBC 驱动程序列表中显示为“Oracle in MyTest”(无引号)。使用带有 EZConnect 的 MSFT ODBC 驱动程序作为this post 建议不会比设置即时客户端之前更好(也就是说,根本没有)。但this post 似乎暗示这是可能的,但没有具体说明如何,connectionstrings.com 只告诉你字符串的数据源部分是什么样的,即 SomeUser/SomePassword@AServer:PortNumber/InstanceName

短版:引用即时客户端 ODBC 驱动程序的经典 ADO 连接字符串的确切语法是什么?

提前感谢您的帮助。我花了很长时间才开始使用 SO...

【问题讨论】:

这篇文章forums.oracle.com/forums/… 似乎解释了为什么 MSFT 的 ODBC 驱动程序不喜欢 ORCL 即时客户端——它提供不支持 ODBC 的 dll,但不包括它们的依赖项。不幸的是,即使我将它们复制到 IC 文件夹中,我也无法让 MSFT 的驱动程序看到这些依赖项。 在工作中(我现在在家,我的时区是 CET),我们一直这样做。有(现有的)Access DB,有时当添加新的 Oracle DB 时,我基本上会在控制中心添加一个 ODBC 连接(就像这里描述的 support.microsoft.com/kb/303968),然后我去复制 Access DB 中的 passthru 对象,然后在这个无限长的字符串中更改数据库名称。我猜你正在寻找这个长字符串。好吧,如果明天您的问题仍未得到解答,我可能需要粘贴该字符串,这可能会有所帮助。 感谢您的帮助,但我实际上希望以“最本机”的语法直接连接到 Oracle 服务器,这要么是 EZ Connect,要么是一种像这样的连接字符串嵌入式 TNS文章描述了使用codeproject.com/KB/vbscript/connection_string.aspx,但正如我在第一条评论中所描述的那样失败了。 我们的想法是让应用程序的 Oracle 和配置占用空间尽可能小。当然,必须安装应用程序文件,但客户端应该很轻(在 Oracleland 中这可不是什么壮举,我正在学习——即使是“即时”客户端 +“即时”ODBC 驱动程序也几乎达到 100MB)和所有指向服务器、实例和登录名必须位于应用程序文件中。没有 TNS,没有 DSN(比如说快 10 倍!)等。如果可能的话。 你试试connectionstrings.com/oracle ? 【参考方案1】:

类似于“user1206604”的回答 - 我使用 ODBC 数据源管理器设置了一个 ODBC 连接(例如,我们将其命名为“DEMO”)并像这样连接:

Dim conn As New adodb.Connection
Set conn = New adodb.Connection

connStr = "Provider=OraOLEDB.Oracle;Data Source=DEMO;User Id=yourUserID;Password=yourPassword;"
conn.Open connStr

Dim api As New adodb.Recordset
Set api = New adodb.Recordset

yourQueryString = "SELECT foo FROM bar"
api.Open yourQueryString, conn, adOpenDynamic, adLockReadOnly 
'adjust above setting as needed

while not api.EOF
  'do interesting stuff here
wend

'clean up resources
api.Close
Set api = Nothing

conn.Close
Set conn = Nothing

在开始菜单 > 程序 > Oracle - oraClient10g > 配置和迁移工具 > Microsoft ODBC 管理员中找到(在我的机器上)ODBC 数据源管理员,如下所示:

【讨论】:

这救了我的命。谢谢!只需声明“Dim connStr, yourQueryString As String”并将“api.MoveNext”添加到循环中。【参考方案2】:

试试这个并根据需要替换值:

Set Connection = CreateObject("ADODB.Connection")

blnTest = Connection.Open("Driver=Oracle in instantclient;Dbq=127.0.0.1:1521/SERVICENAMEHERE", "USERNAME", "PASSWORD")

如果 Instantclient 中的 Oracle 不起作用,请检查 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers 注册表项以查看 Oracle Instant Client 的值(可能附加了版本号)。

如果这仍然不适合您。发表评论并详细说明发生的事情,我会尝试为您调整答案。

【讨论】:

【参考方案3】:
' Create a connection object.'
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection

' Create a recordset object.'
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

' Provide the connection string.'
Dim strConn As String
Dim str As String

'Use the SQL Server OLE DB Provider.'
strConn = "Driver=(Oracle in OraHome92);" & "Data Source=;Uid=;Pwd=;"

'Now open the connection.'
cn.Open strConn
With rs

    ' Assign the Connection object.'
    ActiveConnection = cn

    ' Extract the required records.'
    .Open "SELECT ", cn


End With

【讨论】:

以上是关于Classic ADO / ODBC / Oracle 10g EZConnect 的连接字符串语法的主要内容,如果未能解决你的问题,请参考以下文章

请教ODBC和ADO的区别

转载ADO,OLEDB,ODBC,DAO的区别

请问VC++中如何连接odbc数据源,具体步骤!谢谢!

在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询

使用脚本任务创建 ADO NET (ODBC) 数据流源

Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案