Найти тему
Евгений Нефёдов

К БД (MySQL и не только) через Autolisp

«Давным-давно, в далекой-далекой галактике…», а точнее начале 2019 года был пост про БД. На днях снова пришлось столкнуться и освежить память.

Цель достаточно простая: что-то помещать и/или читать ил БД. В сегодняшнем случае это MySQL.

Что нам потребуется:
самое главное — это драйвер

список установленных драйверов
список установленных драйверов

Для того, что бы посмотреть список драйверов надо в «пуске» написать «ODBC», открыть соответствующее приложение (как правило оно в самом верху). И перейти в одноименную вкладку.

Вот с этими БД, мы точно сможем соединиться (доступны версии и кодировки).

По умолчанию нет драйверов Access — их нужно устанавливать. Стоит отметить, что есть х32 (AccessDatabaseEngine.exe) и х64 (AccessDatabaseEngine_X64.exe).

Основной «затык» в разрядности в том, что все приложения «Office» (Microsoft Word, PowerPoint, Excel и OneNote), должны быть этой же разрядности. Если нет, то придется переустанавливать.

Далее нужна библиотека «ADOLISP_Library.lsp» — в нее зализать не нужно, а тем более что-то править (просто подгружать в Автокад при необходимости).

С примерами можно найти в интернете архив «SQL adolisp252». Пользуясь моментом, еще раз выражу благодарность создателю (даже, если он не увидит этот пост). В примере из архива будет БД х32.

Грузим библиотеку:
(if (not ADOLISP_ConnectToDB) (load "ADOLISP_Library.lsp"))

Теперь самое интересное:
для того, что бы подключиться к БД нужно указывать какой драйвер использовать. Вот разные примеры:

dbFile — полный путь до БД
ConnectString — (значение строка) параметры подключения

(setq ConnectString и далее ….

(strcat ; MSAccess метод1
"Provider=MSDASQL;"
"Driver={Microsoft Access Driver (*.mdb)};"
"DBQ=" dbFile
)

(strcat ; MSAccess метод2
"Provider=Microsoft.Jet.OLEDB.3.51;"
"Data Source=" dbFile
)

(strcat ; MSSQL метод1
"Provider=SQLOLEDB;"
"Driver={SQL Server};"
"Server=" dbServer ";"
"Database=" dbName ";"
"UID=" dbUser ";"
"PWD=" dbPassword
)

(strcat ; MSSQL метод2
"Provider=SQLOLEDB;"
"Data Source=" dbServer ";"
"Initial Catalog=" dbCatalog ";"
"User ID=" dbUser ";"
"Password=" dbPassword
)

(setq ConnectString
"DATABASE=komp_texnika;
DRIVER={MySQL ODBC 8.0 ANSI Driver};
OPTION=0;
PORT=0;
SERVER=localhost;
UID=root2"
)

И еще примеры (возможно неправильные):

(setq ConnectString
"Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Sapralfa-DEMO\\Alpha70\\DataBase\\CableBase.mdb"
)

(setq ConnectString
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Sapralfa-DEMO\\Alpha70\\DataBase\\CableBase.mdb;Persist Security Info=False")

(setq ConnectString
"Provider=SQLOLEDB.1;Password=gdbuser;Persist Security Info=True;User ID=gdbuser;Initial Catalog=GDB_System;Data Source= 46.149.233.164\\GDB_1"
)

Думаю понятно: указать драйвер, сервер, логин и пароль (в разных вариациях)

Вот точно рабочий вариант MySQL:

(setq ConnectString (strcat
"DATABASE=имя_базы;"
"DRIVER={MySQL ODBC 8.0 ANSI Driver};"
"OPTION=0;"
"PORT=0;"
"SERVER=IP_адрес_БД;"
"UID=логин_пользователя;"
"Password=пароль_пользователя"
))

Предполагаем, что библиотека работы с БД уже загружена в Автокад.

Подключение:

(if (not (setq ConnectionObject
(ADOLISP_ConnectToDB ConnectString "" "")
))
(progn
(prompt "\n\n
Не могу подключиться к БД!")
(ADOLISP_ErrorPrinter)
)
(prompt "\n\n
Связь с БД установлена!")
)

Если все Ok, то дальше можно работать с БД используя стандартные запросы MySQL.

Запись в таблицу, (столбцы) и (соответственно данные)

(setq SQLStatement
"INSERT INTO 'test' ('user', 'work', 'permission' ) VALUES ('user2', 'yes', '10');"
)

Могут возникнуть танцы с кавычками: ' ` — как оказалось имеет значение

"INSERT INTO `имя_базы`.`имя_таблицы` (`company`, `phone`, `mail`, `user`) VALUES ('данные1', 'данные2', 'данные3', 'данные4');»

Еще пара примеров (возможно и тут закрались ошибки):
"UPDATE `test` . `test` SET 'user' = 'user5' WHERE `test` . `id` = 3;»
"DELETE FROM `test` WHERE `test`.`id` = 4;»

Как я делал:

в phpmyadmin формировал запросы и просто их копировал, а вместо данных подставлял свои переменные. Это самый надежный и успешный вариант! Набив несколько шаблонов/функций — дальше все как по маслу.

Еще нужно не забывать про то, что к БД могли не подключиться и отправлять запросы было бы бессмысленно. Кстати, библиотека «ADOLISP_Library.lsp» выдает описание ошибок, если они будут.

Стоит еще понимать разницу между виртуальным и VPS хостингом, если работаем с внешним сервером. В первом варианте создание пользователей и прав сильно ограничено.

Вот пример использования:

Пишем в БД log при запуске той или иной функции в Автокад.

Для того, что бы не лазить по phpmyadmin — на развернутом локально сайте просматриваем БД и частично ее редактируем.

В примере MySQL (вкладка «БД тестовая») — сидит в интернете и MSAccess («Кабельная продукция») — расположена локально.

PS
Буду надеяться, что изложенной информации достаточно.
Больше статей в группе: https://vk.com/auto_lisp