OleDB 数据提供程序无法找到 VBA/Excel

5

我对VBA几乎不熟悉(只上过一些学校的课程)。现在我需要从Excel文件连接到远程服务器上运行的Oracle数据库。我搜索了一些例子,写出了以下代码:

    Sub Try()
         Dim cn As New ADODB.Connection
         Dim rs As ADODB.Recordset
         Dim cmd As ADODB.Command
         Dim chunk() As Byte
         Dim fd As Integer
         Dim flen As Long
         Dim Main As ADODB.Parameter
         Dim object As ADODB.Parameter

     Stil = vbYesNo + vbCritical + vbDefaultButton1
        Titel = "db connection test"
    '   Meldung anzeigen.
        Antwort = MsgBox("trying to connect to db", Stil, Titel, Hilfe, Ktxt)

         ' Connect to the database using ODBC [msdaora][ORAOLEDB.Oracle]Provider=ORAOLEDB.Oracle;
         With cn
             .ConnectionString = "Provider=ORAOLEDB.Oracle;Password=pass;User ID=usr;Data Source=host:port:sid"
             .Open
             .CursorLocation = adUseClient
         End With

         ret = cn.Execute("create table newtesttable (main integer, object oid)")

         ' Here is an example if you want to issue a direct
    ' command to the database
         '
         'Set cmd = New ADODB.Command
         'With cmd
         '    .CommandText = "delete from MYTABLE"
         '    .ActiveConnection = cn
         '    .Execute
         'End With
         'Set cmd = Nothing

         '
         ' Here is an example of how insert directly into the
     ' database without using
         ' a recordset and the AddNew method
         '
         Set cmd = New ADODB.Command
         cmd.ActiveConnection = cn
         ' cmd.CommandText = "insert into newtesttable(main,object) values(?,?)"
         cmd.CommandText = "select * from test"
         cmd.CommandType = adCmdText

         ' The main parameter
        ' Set main = cmd.CreateParameter("main", adInteger, adParamInput)
         'main.Value = 100 '' a random integer value ''
         'cmd.Parameters.Append main

         ' Open the file for reading
         'fd = FreeFile
         'Open "myBlobFile.txt" For Binary Access Read As fd
         'flen = LOF(fd)
         'If flen = 0 Then
          '   Close
           '  MsgBox "Error while opening the file"
            ' End
         'End If

         ' The object parameter
         '
         ' The fourth parameter indicates the memory to allocate
     ' to store the object
       '  Set object = cmd.CreateParameter("object", _
       '                                       adLongVarBinary, _
       '                                       adParamInput, _
                                              flen + 100)
       '  ReDim chunk(1 To flen)
       '  Get fd, , chunk()

         ' Insert the object into the parameter object
       '  object.AppendChunk chunk()
       '  cmd.Parameters.Append object

         ' Now execute the command
         Set rs = cmd.Execute

     '   Mldg = "test"
        Stil = vbYesNo + vbCritical + vbDefaultButton1
        Titel = "asdasdasd"
    '   Meldung anzeigen.
        Antwort = MsgBox(rs, Stil, Titel, Hilfe, Ktxt)
         ' ... and close all
         cn.Close
         Close

 End Sub

我相信这段代码存在许多问题,但目前执行 .Open 时失败,显示“找不到提供程序。可能未正确安装”。之后我发现需要下载并安装 ORAOLEDB.dll。我通过安装 ORAOledb11.dll(我尝试了32位和64位版本,尽管我的机器是64位)来完成这个过程。我通过执行命令“regsvr32 OraOLEDB11.dll”进行了安装。
不幸的是,问题仍然存在。 那么,如何排除此问题? 我可以确保 Oraoledb 在我的机器上已经正确安装吗?
非常感谢您提供的任何提示。

我相信这会有所帮助:http://www.dzone.com/snippets/excel-make-query-oracle 一般来说,将Oracle连接到Excel比如“本地”的MSSQL要复杂得多。祝你好运! - Peter L.
另外一个在几个月前帮助过我的链接:http://blog.mclaughlinsoftware.com/microsoft-excel/how-to-query-oracle-from-excel-2007/ - Peter L.
进入Regedit并查看是否存在键HKEY_CLASSES_ROOT\OraOLEDB.Oracle。安装Oracle客户端时,默认情况下不会安装OLEDB驱动程序(您已经安装了Oracle客户端,对吧?)。顺便说一句,这个语法也是错误的,数据源是TNSNAMES文件中引用您的数据库的条目。但这不会导致您遇到的错误。 - Ciarán
感谢您的回答。我在注册表中确实有上述密钥。 - Alex K.
2个回答

4

32位操作系统

我成功地在 Windows XP 虚拟机上实现了这个功能,并从Oracle官方网站下载了 Oracle10g Provider for OLE DB Version 10.1.0.4.0 的Oracle OLEDB提供程序。当前适用于旧操作系统(32位)的链接 OLEDB。

但请注意,它会替换JDK和JRE为较低版本(可以通过修改配置xml - products.xml - 来防止,但我没有足够的精神健康药水,所以我选择了全安装)。安装后,您需要删除环境变量中的引用,因为它可能会影响其他程序。 安装后,我使用 regsvc32 注册了OraOLEDBxx.dll。

我正在使用Excel 2003连接到Oracle db 11G。:)

连接字符串

我必须启用扩展(ActiveX Data Object和record libraries)。返回连接的函数如下:

Public Function connectToDb(provider As String, host As String, sid As String, user As String, pwd As String, db As String) As ADODB.Connection
Dim conn As ADODB.Connection
Dim dbConnectStr As String

    Set conn = New ADODB.Connection
    If provider = "Oracle" Then
        dbConnectStr = "Provider=OraOLEDB.Oracle;Data Source=" & host & ":1521/" & sid & ";User Id=" & user & ";Password=" & pwd & ";"
    Else

    End If
    conn.ConnectionString = dbConnectStr
    conn.Open
    Set connectToDb = conn
End Function

64位操作系统但32位办公套件

当我们的虚拟机迁移到64位的Windows 7Excel 2010时,请确保您下载了正确的ODAC(Oracle Data Access Components)版本以配合您安装的Excel的-bit版本,因为我安装的是32位的Excel,但认为它是64位的(因为Windows是64位的),所以我很难使这个64位的ODAC版本正常工作。之后,我下载了32位版本,现在它的表现和以前一样。安装时,请遵循下载的压缩文件中包含的安装说明。

Oracle网站上当前适用的ODAC链接


谢谢您详尽的回答。不幸的是,我无法再测试它了 :) 不过无论如何我已经点赞了 ;) - Alex K.
@AlexK。我没问题,只是想分享一下我几乎持续了一个星期的挣扎。当我试图在32位Excel中使用64位DLL时,我遇到了与你相同的错误。 - GentSVK
做到了,而且没有数据源:dbConnectStr = "Provider=OraOLEDB.Oracle;Data Source=" & host & ":1521/" & sid & ";User Id=" & user & ";Password=" & pwd & ";" - 非常感谢 - Deunz

0
您可以通过创建一个以.udl结尾的文本文件来确保您的连接字符串准确无误,然后关闭并重新打开该文件。您将会看到一个用户界面,用于连接服务器。输入您的信息并测试连接。如果您的连接正常工作,请关闭该文件。以文本格式打开该文件,并将连接字符串复制到您的代码中。同时确保已选择ADO的引用库。这一行看起来不对:
Data Source=host:port:sid

以下是我用来从文本中提取SQL并将结果提取到文本的示例。
 Public Function ObjectConnect(AID As String, APswd As String)

 ObjectConnect = "Provider=ORAOLEDB;Password=" & APswd & ";Persist Security Info=True;User ID=" & AID & ";Data Source=(nameofserverConn)"

 End Function

Sub RunSQL()

Dim strConn As String
Dim Query As String
Dim txt As Object
Dim ns As ADODB.Connection
Dim rs As ADODB.Recordset
Dim txtfile As Object
Dim f As ADODB.Field
Dim myFileSystemObject As Object
Dim txtN As String
Dim DL As String


FName1 = ""
Query = ""
txtStrngX = ""

Set ns = New ADODB.Connection
Set rs = New ADODB.Recordset
ns.ConnectionTimeout = 99000
ns.CommandTimeout = 99000



ns.Open ObjectConnect('UserID', 'Password') 'this is a public function w. userform for people to enter ID and Password.
With rs
    .ActiveConnection = ns
      'however you're writing the sql it would go here.
    .Open Query 
End With


If rs.State <> 0 Then
    DL = Sheet1.Cells(2, 2)
    RecordsetToText rs:=rs, FullPath:=txtN, ValueDelimiter:=DL  'this is a sub function that writes to a text file.  Didn't include the code but left this.  Here you would want to do something with the recordset.
End If

On Error Resume Next
rs.Close
Set rs = Nothing


End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接