ADN Open CIS
Сообщество программистов Autodesk в СНГ

31/03/2020

Использование базы данных Oracle внутри AutoCAD

Вопрос: Возникла проблема подключения базы Oracle к AutoCAD. Как при помощи API получить информацию из моей базы Oracle?

Ответ: Начиная с AutoCAD 2020 он только 64-разрядный – нет 32-разрядного AutoCAD.

Если вы хотите подключится к Oracle вам понадобятся 64-разрядные OLE Db драйвера клиента Oracle.

Необходимо будет инсталлировать соответствующие драйвера. У меня Oracle 19c database, соответственно мне понадобилось установить драйвера Oracle 19c OLE Db.

 

Oracle Db

 

Oracle Ole Db

 

Теперь подключимся к базе Oracle из AutoCAD VBAIDE

Шаг1: Подключаем соответствующие файлы.

  • AutoCAD 2021 Type Library
  • Ole Automation
  • Microsoft Activex Data Objects
  • Microsoft Activex Data Objects Recordset
  • OraOLEDb 1.0 Type Library


Шаг 2 : Готовим строку подключения

 

"Provider=OraOLEDB.Oracle;User ID=<yourUserId>;Password=<yourPassword>;Data Source=<yourDatabase>;"

Например:

"Provider=OraOLEDB.Oracle;User ID=SYSTEM;Password=Abcdef!23;Data Source=moogalm19;"

UserId : Пользователь, созданный для подключения к вашей базе

Password: Пароль, требующийся для подключения к базе

DataSource: База данных, к которой вы хотите подключится.

Шаг 3: Код, который выполняет подключение и открывает базу.

 

Код - VBA: [Выделить]
  1.  
  2. Sub ReadOracleDB()
  3.     Dim adoDbConn   As New ADODB.Connection
  4.     Dim adoDbRs     As New ADODB.Recordset
  5.     Dim selectCmd   As New ADODB.Command
  6.    
  7.     Dim strCon      As String
  8.     Dim RC, CC      As Long
  9.    
  10.     ' строка подключения, с теми же userId и паролем, которые я использую для входа в sqlplus'
  11.     ' Data Source = имя базы данных'
  12.    
  13.     strCon = "Provider=OraOLEDB.Oracle;User ID=SYSTEM;Password=Aut0desk!23;Data Source=moogalm19;"
  14.     adoDbConn.Open (strCon)
  15.    
  16.     ' открываем таблицу adOpenStatic, и проходимся по всем записям до конца
  17.     adoDbRs.Open "SELECT * FROM EMPLOYEES", adoDbConn, adOpenStatic
  18.    
  19.     If IsNull(adoDbRs.RecordCount) Or (adoDbRs.RecordCount = 0) Then
  20.         MsgBox "Не найдено записей!"
  21.         Exit Sub
  22.     End If
  23.    
  24.     RC = adoDbRs.RecordCount
  25.     CC = adoDbRs.Fields.Count
  26.    
  27.     Dim MyModelSpace As AcadModelSpace
  28.     Set MyModelSpace = ThisDrawing.ModelSpace
  29.     Dim pt(2)       As Double
  30.     Dim MyTable     As AcadTable
  31.    
  32.     ' RC+2 для строк заголовка и шапки таблицы'
  33.    
  34.     Set MyTable = MyModelSpace.AddTable(pt, RC + 2, CC, 10, 60)
  35.    
  36.     Dim i           As Integer
  37.     Dim j           As Integer
  38.    
  39.    
  40.     With MyTable
  41.         .RegenerateTableSuppressed = True
  42.         .RecomputeTableBlock False
  43.         .TitleSuppressed = False
  44.         .HeaderSuppressed = False
  45.         .SetTextStyle AcRowType.acTitleRow, "Standard"
  46.         .SetTextStyle AcRowType.acHeaderRow, "Standard"
  47.         .SetTextStyle AcRowType.acDataRow, "Standard"
  48.        
  49.         Dim col         As New AcadAcCmColor
  50.         col.SetRGB 255, 0, 255
  51.        
  52.         ' Заголовок'
  53.         col.SetRGB 194, 212, 235
  54.         .SetCellBackgroundColor 0, 0, col
  55.         col.SetRGB 127, 0, 0
  56.         .SetCellContentColor 0, 0, col
  57.         .SetCellType 0, 0, acTextCell
  58.         .SetText 0, 0, "MOOGALM19"
  59.        
  60.         ' Шапка'
  61.        
  62.         i = i + 1
  63.         For j = 0 To .Columns - 1
  64.             .SetCellType i, j, acTextCell
  65.             .SetText i, j, CStr(adoDbRs.Fields(j).Name)
  66.            
  67.         Next
  68.        
  69.         ' Строки данных'
  70.        
  71.         For i = 2 To .Rows - 1
  72.             For j = 0 To .Columns - 1
  73.                 .SetCellType i, j, acTextCell
  74.                 .SetText i, j, adoDbRs.Fields(j).Value
  75.                
  76.             Next j
  77.             adoDbRs.MoveNext
  78.         Next i
  79.        
  80.         .RegenerateTableSuppressed = False
  81.         .RecomputeTableBlock True
  82.         .Update
  83.         .GetBoundingBox minp, maxp
  84.         ZoomWindow minp, maxp
  85.         ZoomScaled 0.9, acZoomScaledRelative
  86.        
  87.     End With
  88.    
  89.     ' Закрываем соединение с базой и освобождаем память'
  90.    
  91.     adoDbRs.Close
  92.     Set adoDbRs = Nothing
  93.     Set selectCmd = Nothing
  94.     adoDbConn.Close
  95.     Set adoDbConn = Nothing
  96.       
  97.     ThisDrawing.SetVariable "LWDISPLAY", 1
  98.    
  99. End Sub

Демонстрация:

 

 

Источник: https://adndevblog.typepad.com/autocad/2020/03/connecting-oracle-database-with-autocad.html

 

Автор перевода: Александр Ривилис
Опубликовано 31.03.2020
Отредактировано 31.03.2020 в 10:41:13