| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp и база данных SQL-сервера

AutoLisp и база данных SQL-сервера

Ответ
Поиск в этой теме
Непрочитано 10.12.2008, 08:37 #1
AutoLisp и база данных SQL-сервера
Макс_Кунгур
 
Регистрация: 10.12.2008
Сообщений: 122

Добрый день. Подскажите, пожалуйста. Есть база данных SQL-сервера, в которой находятся координаты X и Y в таблице (название базы - basa, название таблицы - bur, название столбца X - XX, название столбца Y - YY). Как мне при помощи AutoLisp взять эти данные из таблицы и по этим двум координатам построить в AutoCad-е 2007 линию, а точнее перпендикуляр, начиная с этой точки с координатами (X,Y).
Просмотров: 21291
 
Непрочитано 10.12.2008, 09:51
#2
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Вопрос очень расплывчат, неуказан тип сервера, неизвестно в каком виде хранятся данные в таблицах,
хотя проблема вполне решаема, к примеру представим, что сервер MySQL, находится на локальной машине,
на ней установлен ODBC 3.51 Driver имя пользователя root без пароля, посмотри в каком виде вернется результат
и дальше строй и ресуй все, что тебе нравится обязательно поблагодари создателей библиотеки ADOLISP_Library,
для начала вроде все.
Твой код примерно будет выглядеть так:
Код:
[Выделить все]
;;;********************************************* MySQL *********************************************************

(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)


(defun C:MYSQL (/ ConnectionObject Result ConnectString SQLStatement SQLStatement1	      
                  TablesList ColumnsList)

  (setq ConnectString
"DATABASE=basa;DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;PORT=0;SERVER=localhost;UID=root"
        )

       
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString "root" " ")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!")) ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   SQLStatement
"SELECT X FROM bur;"
	   SQLStatement1
"SELECT y FROM bur;"	    

		
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement  SQLStatement1 "\""))
  (if (and(setq    Result (ADOLISP_DoSQL ConnectionObject SQLStatement)
		  Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1)
	  ))	    
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
    

    )
  )
  (prin1)
)
(prin1)
Holon вне форума  
 
Непрочитано 10.12.2008, 09:57
#3
DonJad


 
Регистрация: 20.12.2005
Murmansk
Сообщений: 106


в голову приходит только вариант писать сторонее приложение, в котором связываться с базой, и из ниго в акаде уже отрисовывать... просто не представляю как лиспом таблицу из бд получить....
DonJad вне форума  
 
Автор темы   Непрочитано 10.12.2008, 11:04 Ответ Holon-у
#4
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Holon, отвечаю тебе на вопрос.
Тип сервера - sql server 2000 (MSDE). В таблице 1-й столбец BUR (data type - nvarchar(6)) - номер, 2-й столбец - YY (data type - float) - координата по Y, 3-й столбец - XX (data type - float) - координата по X, 4-й нам не нужен, и 5-й столбец - GL (data type - float) - глубина (т.е. расстояние от точки (X,Y) до второй точки в линии)
Примерно выглядит вот так -
BUR YY XX ZZ GL
00001 8014 16761 145
....... ...... ....... ......

Сервер находится на локальной машине (MAXIM - название сервера)
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 11:23
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


В общем случае:

1. Надо иметь OLEDB Provider для соответствующего SQL-сервера. Для MS SQL это штатная msado15.dll (или более свежая версия).

2. Иметь набор библиотечных функций для работы из VisualLISP с SQL-сервером, путем отправки SQL-запросов. За основу можно взять ADOLisp вот здеся http://acad.fleming-group.com/index.html

3. Написать собственные функции для преобразования данных, полученных из БД в стребуемый вид, например в списки координат для рисования отрезков, полилиний и чего угодно.

4. Здесь не надо делать никакого стороннего приложения - именно из LISP и внутри AutoCAD. А вот редактирование самой БД, с визуальными средствами, может быть сделано и сторонним приложением. Еще лучше - COM-сервером, с которым тот же LISP будет работать. Заодно и координаты в таблицу БД будет легче отправлять.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 10.12.2008, 11:48
#6
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


ShaggyDoc, OLEDB Provider есть, в AutoCad 2007 встроен DbConnect Manager, а вот с третьим проблематично, написать собственные функции для преобразования я не смогу, вот и прошу вас о помощи. В общем то я понимаю как это должно выглядеть, а вот если в частном - не знаю как написать, подскажи хотя бы одну функцию для преобразования, буду благодарен.
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 12:10
#7
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


90% всей работы это подключится к серверу попробуй подключится следующим образом:
Код:
[Выделить все]
;;;********************************************* MS SQL *********************************************************
  (if ConnectionObject(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)


(defun C:qqq (/ ConnectionObject Result ConnectString SQLStatement	      
                  TablesList ColumnsList lst)                 
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\basa;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq SQLStatement
		
"SELECT YY
FROM Table_name
WHERE ((([BUR]) = 00001));"
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement  "\""))
  (if (setq Result (ADOLISP_DoSQL ConnectionObject SQLStatement))
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
    
    )
  )
  (prin1)
)
(prin1)
Holon вне форума  
 
Автор темы   Непрочитано 10.12.2008, 13:51
#8
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


при компиляции пишет error: malformed list on input
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 10.12.2008, 14:06
#9
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


В строке (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString "User" "Password"))) у меня "для входа в сервер использовать учетные сведения windows"
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 15:11
#10
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Какая проблема создать "Юзверя" с паролем?
Код:
[Выделить все]
(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)


(defun C:qqq (/ ConnectionObject Result ConnectString SQLStatement	      
                  TablesList ColumnsList lst)                 
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\base_name;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq SQLStatement
		
"SELECT YY
FROM Table_name
WHERE ((([BUR]) = 00001));"
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement  "\""))
  (if (setq Result (ADOLISP_DoSQL ConnectionObject SQLStatement))
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
    
    )
  )
  (prin1)
)
(prin1)
_$
; 21 forms loaded from #<file "U:/LISP/TEST_PRG/ADOLISP_Library.lsp">
; 3 forms loaded from #<editor "U:/LISP/TEST_PRG/wwp_forum.LSP">
_$

Последний раз редактировалось Holon, 10.12.2008 в 15:22.
Holon вне форума  
 
Автор темы   Непрочитано 10.12.2008, 15:38
#11
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


программа вывела мне то что у тебя в последних двух строчках, а значение YY где должно отобразиться? И что дальше делать?
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 15:49
#12
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


В командной строке набери qqq
В моделе чертежа ACada нажми F2 и посмотри,что пишет.
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 07:38
#13
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Connecting to the database using
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=MAXIM\basa;Initial Catalog=bur31"
Connection failed!
Visual LISP message Automation Error. Недопустимый атрибут строки
подключения
Description Недопустимый атрибут строки подключения
HelpContext 0
HelpFile
NativeError 0
Number -2147467259
SQLState 01S00
Source Microsoft OLE DB Provider for SQL Server

Description [DBNETLIB][ConnectionOpen (Connect()).]SQL-сервер не
существует, или отсутствует доступ.
HelpContext 0
HelpFile
NativeError 17
Number -2147467259
SQLState 08001
Source Microsoft OLE DB Provider for SQL Server

Description Не удается инициализировать поставщика данных.
HelpContext 0
HelpFile
NativeError 31
Number -2147467259
SQLState 08001
Source MSDataShape
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 07:55
#14
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


я переделал строку "Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=MAXIM\\basa;Initial Catalog=bur31" в "Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa". подключение вроде как идет, только не пускает на сервер.
Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa"
Connection failed!
Visual LISP message Automation Error. Недопустимая спецификация
авторизации

Description Недопустимая спецификация авторизации
HelpContext 0
HelpFile
NativeError 0
Number -2147467259
SQLState 28000
Source Microsoft OLE DB Provider for SQL Server
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 08:25
#15
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


создаю нового пользователя, прописываю, программа пишет
Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=baza_pgu"
Connection failed!
Visual LISP message Automation Error. Login failed for user 'GILS'.
Reason: Not associated with a trusted SQL Server connection.

Description Login failed for user 'GILS'. Reason: Not associated with a
trusted SQL Server connection.
HelpContext 0
HelpFile
NativeError 18452
Number -2147467259
SQLState 42000
Source Microsoft OLE DB Provider for SQL Server
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 08:37
#16
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


все разобрался, выдает
Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa"
Result: succeeded!

Inserting a row:
"SELECT YY
FROM bur31
WHERE ((([BUR]) = 00001));"
Result:
Succeeded!

Disconnecting from the database

(("YY") (8014.5))

что дальше делать?
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 08:41
#17
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


тебе надо поиграться, с учетными записями, и для проверки я надеюсь,что ты
незабываешь вносить в эту строку пользователя и пароль:

Код:
[Выделить все]
(if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
еще попробуй подключится с этой учетной записью без лиспа, может твой новый пользователь
не имеет права доступа к этой таблице, видишь вот здесь он ругается:
Visual LISP message Automation Error. Login failed for user 'GILS'.
Reason: Not associated with a trusted SQL Server connection.
Holon вне форума  
 
Непрочитано 11.12.2008, 09:04
#18
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


А вот и отличненько, теперь по аналогии получаем вторую точку

Код:
[Выделить все]
(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)


(defun C:qqq (/ ConnectionObject Result Result1 ConnectString SQLStatement SQLStatement1	      
                  TablesList ColumnsList lst)                 
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\base_name;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   
SQLStatement
"SELECT YY
FROM Table_name
WHERE ((([BUR]) = 00001));"
	       
SQLStatement1	       
"SELECT XX
FROM Table_name
WHERE ((([BUR]) = 00001));"
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement SQLStatement1  "\""))
  (if (setq
	Result  (ADOLISP_DoSQL ConnectionObject SQLStatement)
	Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1 )
	)
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
     (print Result1)
    )
  )
  (prin1)
)
(prin1)
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 09:16
#19
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


вывела обе точки:

Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa"
Result: succeeded!

Inserting a row:
"SELECT YY
FROM bur31
WHERE ((([BUR]) = 00001));SELECT XX
FROM bur31
WHERE ((([BUR]) = 00001));"
Result:
Succeeded!

Disconnecting from the database

(("YY") (8014.5))
(("XX") (16761.0))
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 09:42
#20
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Сейчас нужно построить прямую (перпендикуляр) от точки (XX,YY) до точки (например, T1). Расстояние между точками находится в таблице БД - GL (5-й столбец в БД).
Макс_Кунгур вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp и база данных SQL-сервера

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База данных Лира Koker Лира / Лира-САПР 4 28.08.2006 15:47
База данных площадей помещений с привязкой к замкн. контуру. elena_din AutoCAD 19 19.08.2005 13:40
база данных программы Autodesk Building Systems 2005 Angel80 Прочее. Программное обеспечение 3 06.10.2004 06:28