- Информация раздела AutoLISP. Рекомендуем [Компьютер | Рефераты]


Союз образовательных сайтов

AutoCAD

Проектирование
AutoLISP и VisualLISP
VBA
Delphi

Autodesk Inventor

Проектирование
Программирование

Разное

Программирование в Delphi
Статьи

Студенту

Лекции
Лабораторные работы

Скачать

Документация
Программы
Разное

Контакты

Rambler's Top100  

 

<< Назад

Пример использования Microsoft ActiveX Data Objects (ADO) для доступа к базе данных Microsoft Access

Инициализация методов интерфейса ADO, используя библиотеку типов

(defun DbInitADO ( / ADO_DLLPath)
  (if (null adom-Append)
    (progn

      ;; Если используется NT платформа, то необходимо
      ;; жестко прописать путь к библиотеке (рекомендация)


      (setq ADO_DLLPath
        (strcat (getenv "systemdrive")
        "\\Program Files\\Common Files\\System\\Ado\\")
      )

      ;; Если мы нашли библиотеку ...

      (if (findfile (strcat ADO_DLLPath "msado15.dll"))

        ;; Импортируем её

        (vlax-Import-Type-Library
          :tlb-filename   (strcat ADO_DLLPath "msado15.dll")
          :methods-prefix    "adom-"
          :properties-prefix "adop-"
          :constants-prefix  "adok-"
        )
        ;; Если не находим - сообщаем пользователям
        (alert (strcat "Cannot find\n" ADO_DLLPath "msado15.dll"))
      )
    )
  )
)

Создаем присоединение к MS-Access или MS-SQL Server Databases

;;;*******************************************************************
;;; Присоединение к MS-Access Database с использованием ODBC (без DSN)
;;; Например, (DbConnect_MSAccess1 "d:/dbfiles/products.mdb")
;;;*******************************************************************

(defun DbConnect_MSAccess1 (dbFile)
  (strcat
    "Provider=MSDASQL;"
    "Driver={Microsoft Access Driver (*.mdb)};"
    "DBQ=" dbFile
  )
)

;;;******************************************************************
;;; Присоединение к MS-Access Database используя JET 3.51
;;; Например, (DbConnect_MSAccess2 "d:/dbfiles/products.mdb")
;;;******************************************************************

(defun DbConnect_MSAccess2 (dbFile)
  (strcat
    "Provider=Microsoft.Jet.OLEDB.3.51;"
    "Data Source=" dbFile
  )
)

;;;******************************************************************
;;; Присоединение к MS-SQL Database используя ODBC (без DSN)
;;; Например, (DbConnect_MSSQL1 "SQLSERVER1" "products" "sa" "")
;;;******************************************************************

(defun DbConnect_MSSQL1 (dbServer dbName dbUser dbPassword)
  (strcat
    "Provider=SQLOLEDB;"
    "Driver={SQL Server};"
    "Server=" dbServer ";"
    "Database=" dbName ";"
    "UID=" dbUser ";"
    "PWD=" dbPassword
  )
)

;;;******************************************************************
;;; Присоединение к MS-SQL Database без использования ODBC
;;; Например, (DbConnect_MSSQL2 "SQLSERVER2" "pr_catalog1" "sa" "")
;;;******************************************************************

(defun DbConnect_MSSQL2 (dbServer dbCatalog dbUser dbPassword)
  (strcat
    "Provider=SQLOLEDB;"
    "Data Source=" dbServer ";"
    "Initial Catalog=" dbCatalog ";"
    "User ID=" dbUser ";"
    "Password=" dbPassword
  )
)

Создаем SQL запрос для разных случаев
(colName и Value должны быть не nil или иметь значения)

(defun DbSQLCommand (tblName colName Value)
  (cond
    ( (and colName value (= (type value) 'STR))
      (strcat "SELECT * FROM " tblName " WHERE " colName " = '" Value "'")
    )
    ( (and colName value (= (type value) 'INT))
      (strcat "SELECT * FROM " tblName " WHERE " colName " = " (itoa Value) )
    )
    ( (and colName value (= (type value) 'REAL))
      (strcat "SELECT * FROM " tblName " WHERE " colName " = " (itoa (fix Value)) )
    )
    ( T (strcat "SELECT * FROM " tblName ) )
  ); cond
)

Выгружаем объекты VLA из памяти

(defun MxRelease (xObject)
  (if (not (vlax-object-release-p xObject))
    (vlax-Release-Object xObject)
  )
)

Закрываем ADO Connection Object и освобождаем память

(defun DbCloseConnection (dbConnObject)
  (vlax-Invoke-Method dbConnObject "Close")
  (MxRelease dbConnObject)
)

Закрываем ADO RecordSet Object и освобождаем память

(defun DbCloseRecordset (rsObject)
  (vlax-Invoke-Method rsObject "Close")
  (MxRelease rsObject)
)

Проверяем, закрыт ли RecordSet (возвращает T или nil)

(defun DbRsIsClosed (rsObject)
  (= adok-adStateClosed (vlax-Get-Property rsObject "State"))
)

Возвращаем число записей в ADO RecordSet Object

(defun DbRsCount (rsObject)
  (vlax-Get-Property rsObject "RecordCount")
)

Возвращает имена полей из Field Object и колическтво полей

(defun DbGetFields (fObject fCount / FieldNumber)
  (setq FieldNumber -1)

  (while (> fCount (setq FieldNumber (1+ FieldNumber)))
    (setq FieldList
      (cons
        (vlax-Get-Property 
          (DbRsFieldItem FieldsObject FieldNumber) "Name"
        )
        FieldList
      )
    ); setq
  ); end while
); defun

Возвращает ADO Field object (поле) из RecordSet Object

(defun DbRsFields (rsObject)
  (vlax-Get-Property rsObject "Fields")
)

Возвращает количество полей от принимаемого Field Object

(defun DbRsFieldCount (fObject)
  (vlax-Get-Property fObject "Count")
)

Получить имя поля (Item) из Field Object

(defun DbRsFieldItem (fObject fNumber)
  (vlax-Get-Property fObject "Item" fNumber)
)

Возвращает объект RowSet из RecordSet object

(defun DbRsGetRows (rsObject)
  (vlax-Invoke-Method rsObject "GetRows" adok-adGetRowsRest)
)

Применяет ADO Cursor Type получаемого RecordSet Object

(defun DbRsCursorType (rsObject curType)
  (cond
    ( (= (strcase curType) "KEYSET")
      (vlax-Put-Property rsObject "CursorType" adok-adOpenKeyset)
    )
    ( (= (strcase curType) "DYNAMIC")
      (vlax-Put-Property rsObject "CursorType" adok-adOpenDynamic)
    )
  )
)

Применяет ADO Lock Type получаемого RecordSet Object

(defun DbRsLockType (rsObject lockType)
  (cond
    ( (= (strcase lockType) "OPTIMISTIC")
      (vlax-Put-Property rsObject "LockType" adok-adLockOptimistic)
    )
    ( (= (strcase lockType) "BATCHOPTIMISTIC")
      (vlax-Put-Property rsObject "LockType" adok-adLockBatchOptimistic)
    )
    ( (= (strcase lockType) "READONLY")
      (vlax-Put-Property rsObject "LockType" adok-adLockReadOnly)
    )
  )
)

Создает и возвращает ADO Connection object

(defun DbConnection ()
  (vlax-Create-Object "ADODB.Connection")
)

Создает и возвращает ADO RecordSet object

(defun DbRecordSet ()
  (vlax-Create-Object "ADODB.RecordSet")
)

Функция собирвает все ошибки в список ("name" . "value")

(defun ErrorProcessor
  (VLErrorObject ConnectionObject / ErrorsObject
    ErrorObject ErrorCount ErrorNumber ErrorList
    ErrorValue
  )

  ;; Вначале получает сообщение об ошибке Visual LISP

  (setq ReturnList
        (list
          (list
            (cons "Сообщение Visual LISP"
            (vl-Catch-All-Error-Message VLErrorObject)
          )
        )
      )
      ;; Получаем ошибки объекта ADO и их количество

        ErrorObject  (vlax-Create-object "ADODB.Error")
        ErrorsObject  (vlax-Get-Property ConnectionObject "Errors")
        ErrorCount   (vlax-Get-Property ErrorsObject "Count")
        ErrorNumber -1
  )

  ;; Цикл через все ошибки ADO ...
  (while (< (setq ErrorNumber (1+ ErrorNumber)) ErrorCount)

      ;; Получаем ссылку на объект текущей ошибки
      (setq ErrorObject (vlax-Get-Property ErrorsObject "Item" ErrorNumber)
            ErrorList nil ;; Очищаем список элементов этой ошибки
      )

    ;; Цикл через все возможные элементы ошибок данной ошибки
    (foreach ErrorProperty
        '("Description" "HelpContext" "HelpFile"
          "NativeError" "Number" "SQLState" "Source"
         )
      ;; Получаем значение текущего элемента. Если это число ......
      (if 
        (numberp
          (setq ErrorValue
            (vlax-Get-Property ErrorObject ErrorProperty)
        ))
        ;; Преобразуем в строку
        (setq ErrorValue (itoa ErrorValue))
      )
      ;; И добавляем в список
      (setq ErrorList (cons (cons ErrorProperty ErrorValue) ErrorList))
    ); end foreach

    ;; Добавляем список для текущей ошибки и возвращаем значениеvalue
    (setq ReturnList (cons (reverse ErrorList) ReturnList))
  ); end while

  ;; Устанавливаем возвращемеое значение в правильном порядке
  (reverse ReturnList)

); defun

Выводит список ошибок, сгенерированный функцией ErrorProcessor function. Функция ErrorProcessor должна вызываться, котгда используются диалоги DCL и ErrorPrinter после показа диалогового окна.

(defun ErrorPrinter (ErrorsList)
  (foreach ErrorList ErrorsList
    (prompt "\n")
    (foreach ErrorItem ErrorList
      (prompt (strcat (car ErrorItem) "\t\t" (cdr ErrorItem) "\n") )
    )
  )
  (prin1)
)

<< Назад


Чтобы быть в курсе всех событий, получения необходимой и интересной информации, подпишись на рассылку "Создание САПР на базе продуктов Autodesk"

 

 
BESTHOSTING - хостинг от 6 уе за 1000 Мб места на диске, домен - бесплатно!
Домой | AutoCAD | Autodesk Inventor | Разное | Студенту | Скачать | Контакты |                                              Каталог

(с) 2004 Калугин Сергей Сергеевич
Сайт управляется системой uCoz