Подключение Excel к базе данных Oracle - PullRequest
0 голосов
/ 21 марта 2019

У меня есть лист Excel со списком чисел (столбец а). Исходя из этого диапазона чисел, мне нужно извлечь выбранные столбцы из таблицы в базе данных Oracle и вернуть их в Excel в столбце B.

Я намерен развернуть электронную таблицу с кодом 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

1 Ответ

0 голосов
/ 22 марта 2019

Если ваш 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 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...