Подключите Excel к внешней базе данных Oracle 19 через VBA и ODBC

#excel #vba #connection #oracle19c

#excel #vba #подключение #oracle19c

Вопрос:

Во-первых, извините, если мой английский не настолько хорош; Я стажер в области разработки программного обеспечения и все еще изучаю английский.

Я создал виртуальную машину на vSphere с Oracle 19c и 64-разрядной версией Windows Server 2016 и создал файл Excel с макросами на этой машине. Этот файл Excel предназначен для нашего клиента для создания счетов-фактур на основе данных из базы данных Oracle. Теперь наш клиент не должен работать на своем сервере позже, когда наше программное обеспечение и база данных будут доставлены, вместо этого он должен делать то, что он делает на внешнем клиенте, который, возможно, находится в той же сети.

Вот где начинается проблема, я скопировал файл на свой ноутбук и изменил строку подключения на "HOST=..." часть с IP-адресом виртуальной машины. Когда я запускаю подраздел, появляется окно с сообщением: [Microsoft][ODBC Driver Manager] The Datasourcename was not found, and no default driver specified.

Спасибо за вашу помощь.

 Private Sub Cmd1_Click()
'Variablen deklaration
Dim dbConnection As ADODB.Connection
Dim recordSet As ADODB.recordSet
Dim conString As String
Dim ipAddress As String
Dim port As String
Dim userId As String
Dim password As String
Dim driver As String
Dim dateFrom As String
Dim dateTo As String
Dim Query As String
Dim Lastrow1 As Long
Dim Lastrow2 As Long

'Vorhandene Daten löschen vor dem neuschreiben
Lastrow1 = ThisWorkbook.Sheets("Lagergeld").Range("B" amp; 
Rows.Count).End(xlDown).Row
ThisWorkbook.Sheets("Lagergeld").Range("B3:H" amp; Lastrow1).Clear

Lastrow2 = ThisWorkbook.Sheets("Dienstleistungen").Range("B" amp; 
Rows.Count).End(xlDown).Row
ThisWorkbook.Sheets("Dienstleistungen").Range("B3:H" amp; Lastrow2).Clear

Set dbConnection = New ADODB.Connection

' Variables are in a table in the same workbook
userId = Worksheets("Stammdaten").Range("Q4").Value 
password = Worksheets("Stammdaten").Range("Q5").Value 
ipAddress = Worksheets("Stammdaten").Range("Q6").Value '10.10.10.120
port = Worksheets("Stammdaten").Range("Q7").Value '1521 
driver = Worksheets("Stammdaten").Range("Q8").Value ' {Oracle in 
OraDB19Home1} tried several like {Microsoft ODBC for Oracle} and others

conString = "Driver=" amp; driver amp; ";" amp; _
            "CONNECTSTRING=(DESCRIPTION=" amp; _
            "(ADDRESS=(PROTOCOL=TCP)" amp; _
            "(HOST=" amp; ipAddress amp; ")(Port=" amp; port amp; "))" amp; _
            "(CONNECT_DATA=(SERVICE_NAME=prod.world)));" amp; _
            "user id=" amp; userId amp; ";password=" amp; password amp; ";)"

dbConnection.Open (conString)

dateFrom = Worksheets("Auswahl").Range("B12").Value
dateTo = Worksheets("Auswahl").Range("C12").Value
dateFrom = dateFrom amp; " 00:00:00"
dateTo = dateTo amp; " 23:59:59"

'Lagergeld
', VasStfCarrierFamilyTypes vscft
Query = " SELECT TO_CHAR(vsf.CreationTime, 'DD.MM.YYYY'), vscf.Name, 
vscf.ReferenceHeight *" amp; _
        " vscfh.Factor, vsf.TaxAttribute1, vsf.TaxAttribute2, vsf.Quantity, 
vsf.TaxPoint " amp; _
        " FROM VasStorageFee vsf, VasStfCarrierFamily vscf, 
VasStfCarrierFamilyHeight vscfh" amp; _
        " WHERE 1 = 1 " amp; _
        " AND vsf.CreationTime >= TO_DATE('" amp; dateFrom amp; "', 'DD-MM-YYYY 
         HH24:MI:SS') " amp; _
        " AND vsf.CreationTime <= TO_DATE('" amp; dateTo amp; "', 'DD-MM-YYYY 
          HH24:MI:SS')" amp; _
        " AND vsf.OwnerCode = '" amp; Modul1.GetOwnerCode amp; "'" amp; _
        " AND vsf.CarrierFamily = vscf.ID " amp; _
        " AND vsf.EffectiveHeight = vscfh.ID " amp; _
        " ORDER BY vsf.CreationTime ASC"


Set recordSet = dbConnection.Execute(Query)

ThisWorkbook.Sheets("Lagergeld").Activate
ThisWorkbook.Sheets("Lagergeld").Range("B3").CopyFromRecordset recordSet
ThisWorkbook.Sheets("Lagergeld").Range("B3").NumberFormat = "dd.mm.yyyy"

recordSet.Close

'Dienstleistungen
Query2 = " SELECT TO_CHAR(vsf.CreationTime, 'DD.MM.YYYY'), va.Description, 
           vsf.CarrierCode," amp; _
         " vsf.MessageText, vsf.ArticleCode, vsf.Quantity,  vsf.Taxpoint " amp; 
           _
         " FROM VasServiceFee vsf, VasActivity va" amp; _
         " WHERE 1 = 1" amp; _
         " AND vsf.CreationTime >= TO_DATE('" amp; dateFrom amp; "', 'DD-MM-YYYY 
           HH24:MI:SS') " amp; _
         " AND vsf.CreationTime <= TO_DATE('" amp; dateTo amp; "', 'DD-MM-YYYY 
           HH24:MI:SS')" amp; _
         " AND vsf.OwnerCode = '" amp; Modul1.GetOwnerCode amp; "'" amp; _
         " AND vsf.Activity = va.ID " amp; _
         " ORDER BY vsf.CreationTime ASC"


Set recordSet = dbConnection.Execute(Query2)

ThisWorkbook.Sheets("Dienstleistungen").Range("B3").CopyFromRecordset 
recordSet
ThisWorkbook.Sheets("Dienstleistungen").Range("B3").NumberFormat = 
"dd.mm.yyyy"

recordSet.Close

dbConnection.Close
End Sub
 

Комментарии:

1. Я попытался установить несколько драйверов, но, похоже, никто не работает.

2. Ваша строка подключения, по крайней мере, имеет несоответствие в скобках

3. ооо, вы были правы, я исправил это, но он по-прежнему выдает мне ту же ошибку

Ответ №1:

решение было найдено благодаря Элитону, который прокомментировал другую проблему. Теперь я установил правильный драйвер и настроил tnsnames.ora и переменные среды. С помощью sqlplus и ODBC -Manager от Microsoft я смог успешно подключиться. единственное, что было неправильным, это моя строка подключения, она должна быть:

 conString = "Driver={Oracle in instantclient_19_6}; DBQ=prod.world; PUID=myUser;" amp; _ 
            "Pwd=myPassword"