Excel 连接到 Oracle 数据库

Posted

技术标签:

【中文标题】Excel 连接到 Oracle 数据库【英文标题】:Excel connection to Oracle database 【发布时间】:2019-03-21 19:32:41 【问题描述】:

我有一个带有数字列表的 Excel 工作表(a 列)。根据该数字范围,我需要从 Oracle 数据库中的表中检索选定的列,并将其带回 B 列中的 Excel。

我打算将带有 vba 代码的电子表格部署给其他用户,所以我不想要一个硬编码到特定计算机的方法。

我有以下信息: Oracle数据库名、Oracle用户名、Oracle密码、Oracle表名

我在网上找到了一个代码,它使用公式调用 vba 代码连接到 Oracle。返回结果时,我收到 #Value 错误消息。 B1 列中有一个公式 [=GetToadData(A1)],用于检索 A1 列中的查找值。这会触发 VBA 函数代码连接到 Oracle 并检索请求的数据 [HANDSET_SERIAL_NUMBER_NEW, SERVREQ_TRANSACTION_TS]。

我得到 #value 作为公式结果,这意味着我的 sql 代码或连接字符串有问题。如果需要,我可以澄清任何事情。

XXXXX = 用户定义的输入

Function GetToadData(IMEI)    
    Dim Conn As New ADODB.Connection
    Dim RS As New ADODB.Recordset
    Dim Cmd As New ADODB.Command

    Conn.Open "PROVIDER=MSDAORA.Oracle;DATA SOURCE=XXXXX;USER ID=XXXXX;PASSWORD=XXXXX"
    Cmd.ActiveConnection = Conn
    Cmd.CommandType = adCmdText
    Cmd.CommandText = "select HANDSET_SERIAL_NUMBER_NEW, SERVREQ_TRANSACTION_TS,  from mi_tempadm.wome_tm_data_new where HANDSET_SERIAL_NUMBER_NEW  = IMEI;"                                           

    Set RS = Cmd.Execute
    GetToadData = RS.Fields(0).Value
End Function

【问题讨论】:

“最佳”方法可能会根据您的具体情况而有所不同,但通常使用 ADO。通过谷歌可以找到很多这样的例子——例如。 vbaexpress.com/forum/… 每个用户都需要安装适当版本的 Oracle 客户端。 您需要非常具体地了解您的实际问题,以便在此处获得有用的建议。 以下是我想使用但无法正常工作的代码: 如果您不提供确切您尝试了什么的详细信息,没有人可以帮助您。除此之外,您只是要求一个教程类型的答案,其中有很多可以通过谷歌搜索“Excel ADO Oracle”找到 如果您想发布代码,编辑您的问题以添加它 - 不要尝试将其放在评论中,或将其发布在答案中。如果您从 Sub 而不是从工作表调用函数,您将获得更多有用的调试信息。 【参考方案1】:

如果您的 IMEI 是数字,则:

Cmd.CommandText = "select HANDSET_SERIAL_NUMBER_NEW, SERVREQ_TRANSACTION_TS, " & _ 
    " from mi_tempadm.wome_tm_data_new where HANDSET_SERIAL_NUMBER_NEW  = " & IMEI

如果不是数字,则用'括起来

不要忘记在RS.EOF 的情况下添加检查(未找到匹配项)

尝试从 sub 调用您的函数,任何错误都会更加明显:

Sub testOracle()

   Debug.Print GetToadData(1234)

End sub

编辑 - 缓存示例(未经测试)

 Function GetToadData(IMEI)

    Dim Conn As New ADODB.Connection
    Dim RS As New ADODB.Recordset
    Dim Cmd As New ADODB.Command
    Static cache as Object

    'create cache if not already created
    If cache Is Nothing Then Set cache = CreateObject("scripting.dictionary")

    If Not cache.exists(IMEI) Then
        Conn.Open "PROVIDER=MSDAORA.Oracle;DATA SOURCE=XXXXX;" & _
                   "USER ID=XXXXX;PASSWORD=XXXXX"
        Cmd.ActiveConnection = Conn
        Cmd.CommandType = adCmdText
        Cmd.CommandText = " select HANDSET_SERIAL_NUMBER_NEW, SERVREQ_TRANSACTION_TS, " & _
                          " from mi_tempadm.wome_tm_data_new " & _
                          " where HANDSET_SERIAL_NUMBER_NEW=" & IMEI
        Set RS = Cmd.Execute
        If Not RS.EOF Then
            cache(IMEI) = RS.Fields(0).Value
        Else
            cache(IMEI) = "????"
        End If
    End If 'not cached

    GetToadData = cache(IMEI)


End Function

【讨论】:

蒂姆-谢谢!我的 sql 语句中缺少 ' 。关于通过 sub 运行函数的建议对调试代码也有很大帮助! B1 中的公式能够根据 A1 中的单元格值检索日期。所以我将公式复制到范围的末尾......确实需要很长时间才能检索请求的数据! 你会发现这样的函数的性能很差,随着工作簿的重新计算,它可能最终会被执行多次。您可以做的一件事(如果您的数据不经常更新)是将结果缓存在(例如)脚本字典中,以便您可以跳过对同一输入的重复查找。参见例如 - ***.com/questions/39902879/…

以上是关于Excel 连接到 Oracle 数据库的主要内容,如果未能解决你的问题,请参考以下文章

尽管我已经安装了驱动程序,但无法将 Excel 连接到 Oracle。 (使用 Excel 的 PowerQuery)

使用excel连接到远程sql数据库

oracle 导入数据问题

GlobalMapper精品教程023:Excel数据通过相同字段连接到属性表中(气温降水连接到气象台站)

尝试在 Excel 中使用 VBA 连接到数据库时出错

通过 Excel 在线连接到 MySQL 数据库