首页 > 解决方案 > Excel 连接到 Oracle 数据库

问题描述

我有一个带有数字列表(a 列)的 Excel 工作表。根据该数字范围,我需要从 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

标签: excelvbaoracledatabase-connection

解决方案


如果您的 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

推荐阅读