Работа с СУБД MSSQL из AutoCad. MSSQL + AUTOLISP

Всем желаю здравствовать! В этом посте речь пойдет об использовании СУБД MSSQL в связке с автокадом при помощи языка LISP. Этот урок рассчитан на пользователя, который представляет себе что такое СУБД MSSQL и язык LISP.

Меня всегда интересовал вопрос как можно выполнять запросы к СУБД для автоматизации некоторых действий. На просторах интернета нашел для себя решение, которое удалось реализовать самостоятельно. Наверняка существуют более продвинутые способы выполнения запросов к СУБД, но я их не знаю. Сразу оговорюсь что сервер БД установлен на той же машине где запускается автокад.

Для того, чтобы связка MSSQL + AUTOLISP заработала мы будем использовать библиотеку ADOLisp252. Скачать ее можно с сайта разработчика по этой ссылке: скачать ADOLisp252.

Скачав и распаковав архив вы увидите 4 файла:

  • ADOLISP.pdf — файл справки на английском языке;
  • ADOLISP_Example.lsp — файл примера работы библиотеки;
  • ADOLISP_Library.lsp — сама библиотека, которую необходимо загрузить в среду Автокад;
  • ADOLISP_test.mdb — небольшая база данных формата access для теста.

Для автоматической загрузки библиотеки ADOLisp252 я использую способ, описанный мной в посте Автоматическая загрузка файлов lisp

Рассмотрим функции для работы с СУБД, реализованные в библиотеке.

ADOLISP_ConnectToDB  осуществляет соединение с базой данных. Принимает значения трех аргументов: ConnectString, UserName, Password.

В случае успешного соединения с СУБД функция возвращает указатель на соединение т.н. «Connection Object», который необходимо сохранить в переменную для дальнейшего использования в функциях библиотеки. Если установить соединение не удалось — функция возвращает NIL.

Аргументы:

  • ConnectString -cтрока, содержащая или строку соединения OLEDB, или имя UDL файла (включая расширение “.udl”) в текущем каталоге, либо указание полного путь к файлу.
  • UserName — имя пользователя базы данных
  • Password — пароль пользователя.

Ниже приведены две строки соединения OLEDB:

Для соединения с сервером SQL посредством ODBC

  1. "Provider=MSDASQL;Driver={SQL Server};Server=server;Database=dbname;UID=user;PWD=password"

Для соединения с сервером SQL без ODBC

  1. "Provider=SQLOLEDB;Data Source=Server;Initial Catalog=dbname;User ID=user;Password=password"

ADOLISP_DoSQL выполняет SQL запрос, принимает значение двух аргументов.

Аргументы:

  • ConnectionObject указатель на открытое соединение возвращенный функцией ADOLISP_ConnectToDB
  • SQLStatement строка SQL запроса

В случае успешного завершения обработки запроса «SELECT…»  возвращает список (list), назовем его главным, чтобы не путаться. Возвращаемый главный список состоит из списков содержащих результат выполнения запроса, при этом первый член главного списка это список с именами столбцов в соответствии с запросом, далее ,если есть, идут списки со строками. Выглядит это примерно так:

  1. (
  2.  
  3. ("Имя Столбца 1" "Имя Столбца 2" "Имя Столбца 3" ) ; это имена столбцов
  4.  
  5. ("Значение Строки 1 Столбца 1" "Значение Строки 1 Столбца 2" "Значение Строки 1 Столбца 3"; список со значениями 1 строки
  6.  
  7. ("Значение Строки 2 Столбца 1" "Значение Строки 2 Столбца 2" "Значение Строки 2 Столбца 3"; список со значениями 2 строки
  8.  
  9. ; и т.д.
  10.  
  11. )

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

В случае успешного выполнения запросов «INSERT…», «UPDATE…», «DELETE…» или иных запросов, результатом выполнения которых не является таблица — функция возвращает Т.

В случае не удачного  выполнения запроса функция возвращает NIL.

ADOLISP_DisconnectFromDB закрывает установленное соединение с БД. Принимает значение одного аргумента.

Аргументы:

  • ConnectionObject указатель на открытое соединение возвращенный функцией ADOLISP_ConnectToDB

Функция всегда возвращает Т.

Примечание. Данная функция не обнуляет переменную, которая содержит указатель на соединение (ConnectionObject). Поэтому если где-то далее по коду планируется использовать функции библиотеки и установка соединения производится способом проверки на NIL переменной содержащей указатель на открытое соединение то  переменную после использования функции ADOLISP_DisconnectFromDB необходимо обязательно обнулить!

Обработка ошибок.
В случае возникновения ошибок при выполнении функций ADOLISP максимально возможное количество информации возвращаемой сервером сохраняется в глобальной переменной ADOLISP_ErrorList. Данная переменная представляет собой список списков в котором хранится ответ сервера. Если просто вывести ее значение то получим не очень приглядную картину.

Для получения информации об ошибке в более читабельном виде можно использовать встроенную в библиотеку функцию ADOLISP_ErrorPrinter. Она выводит список в распарсенном виде, что более наглядно.

Желающие могут написать свой парсер переменной ADOLISP_ErrorList.

Пример кода для соединения с базой данных MSSQL:

  1. (setq
  2.  ;если сервер крутится на локальной машине можно воспользоваться функцией getenv
  3.  ;которая считывает значение переменной окружения AutoCAD или Windows с наименованием, заданным аргументом
  4.  ;(getenv "computername")
  5.  Server  "Server"; указываем имя сервера
  6.  Database "dbname" ; указываем базы данных
  7.  UID "user" ; указываем имя пользователя
  8.  PWD "pass" ; указываем пароль пользователя
  9. )
  10. (setq
  11. 	;создаем строку подключения (указал обе)
  12. ConnectString
  13. 	;(strcat "Provider=MSDASQL;Driver={SQL Server};Server="Server";Database="Database";UID="UID";PWD="PWD)
  14. 	(strcat "Provider=SQLOLEDB;Data Source="Server";Initial Catalog="Database";User ID="UID";Password="PWD)
  15. )
  16. (if 
  17. 	(setq ConnectionObject (ADOLISP_ConnectToDB ConnectString UID PWD))
  18. 		(progn ;true
  19. 			(prompt (strcat "Connection to " Database " succeeded!")) ; вывод в командную строку
  20. 			(princ); тихий выход
  21. 		);true
  22. 		(progn ;false
  23. 			(print (strcat "Connection to " Database " failed!")) ; вывод в командную строку
  24. 			(princ) ; тихий выход
  25. 		);false
  26. );if

Скачать файл dbConnect.lsp с кодом.

One Reply to “Работа с СУБД MSSQL из AutoCad. MSSQL + AUTOLISP”

  1. Тема работы с БД через Autolisp очень актуальна, конечно сам не пробовал работать полноценной БД, но планирую, в основном использовал Excel в качестве БД, в основном только для считывания данных

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *