明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2494|回复: 7

[基础] ****老调重弹,VLISP链接数据库,并赋值!(想到办法了,已解决)****

  [复制链接]
发表于 2009-12-1 20:00:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-12-4 16:37:29 编辑

如下:

(defun DbInitADO ( / ADO_DLLPath)
(if (null adom-Append)
    (progn
      (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 "不能找到以下文件\n" ADO_DLLPath "msado15.dll"))
      )
    )
)
)


;生成MS-Access 或 MS-SQL Server 数据库的连接字符串  
;;;******************************************************************
;;; 使用ODBC(不需要DSN)连接MS-Access数据库
;;; 示例: (DbConnect_MSAccess1 "d:/dbfiles/products.mdb")
;;;******************************************************************

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

;从内存中释放VLA对象
(defun MxRelease (xObject)
vlax-object-released-p
(if (not (vlax-object-released-p xObject))
    (vlax-Release-Object xObject)
)
)

;关闭ADO Connection 对象并将内存释放出来  
(defun DbCloseConnection (dbConnObject)
(vlax-Invoke-Method dbConnObject "Close")
(MxRelease dbConnObject)
)

;关闭ADO RecordSet对象并将内存释放出来
(defun DbCloseRecordset (rsObject)
(vlax-Invoke-Method rsObject "Close")
(MxRelease rsObject)
)

;布尔测试RecordSet 是否为 Closed (T 或 nil)
(defun DbRsIsClosed (rsObject)
(= adok-adStateClosed (vlax-Get-Property rsObject "State"))
)

;返回一个ADO RecordSet对象中的记录数
(defun DbRsCount (rsObject)
(vlax-Get-Property rsObject "RecordCount")
)

;返回Field对象中给定字段数的字段名称
(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

;从RecordSet对象返回ADO Field对象
(defun DbRsFields (rsObject)
(vlax-Get-Property rsObject "Fields")
)

;返回给定Field对象的字段数量
(defun DbRsFieldCount (fObject)
(vlax-Get-Property fObject "Count")
)

;获取Field对象的字段名(项)
(defun DbRsFieldItem (fObject fNumber)
(vlax-Get-Property fObject "Item" fNumber)
)

;返回RecordSet对象的RowSet对象
(defun DbRsGetRows (rsObject)
(vlax-Invoke-Method rsObject "GetRows" adok-adGetRowsRest)
)

;应用一个ADO LOCK(锁定)类型到给定的RecordSet对象
(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)
    )
)
)

(defun Search(RSObject / lst FieldsObject FieldCount FieldList ReturnValue)
(defun getlst    (var)
    (setq lst nil)
    (setq n (length var) i 0)
    (while (< i n)
      (setq lst (append lst (list (vlax-variant-value (nth i var)))))
      (setq i (1+ i))
    )
    lst
)
(setq    FieldsObject (DbRsFields RSObject)        ;; 将字段作为对象
    FieldCount   (DbRsFieldCount FieldsObject)        ;; 取得列的数量
    FieldList    (DbGetFields FieldsObject FieldCount)    ;; 取得列表中所有列的名称
    ReturnValue (list (reverse FieldList)))        ; setq
(setq    lst (vlax-safearray->list (vlax-variant-value (dbrsgetrows rsobject))))
(setq lst (mapcar 'getlst lst))
(setq lst (mapcar '(lambda(var1 var2) (append (list var1) (list var2))) (car returnvalue) lst))
(print lst)
)

;A sample...
(defun c:test (/ getlst dbconnection rsobject SqlString)
(DbInitADO)                ;初始化
(setq DBConnection (vlax-create-object "adodb.connection"))        ;创建并返回ADO Connection对象
(setq RSObject (vlax-create-object "adodb.recordset"))        ;创建并返回ADO RecordSet对象


(setq SqlString "select 点号  from aaa")   ;;;想到办法了,SELECT可以选多个,只要逗号分隔就OK了!!!
  

;;;如果还想读另一个字段或者更多字段下的列表该如何写???

;;;如有另一字段为“标高”

;;;能否(setq SqlStrings "select 标高  from aaa")  ;;;那么如何不重复定义(search rsobject)


(vlax-invoke-method DBConnection "open" (DbConnect_MSAccess1 "e:\\AAA.mdb") "admin" "" adok-adConnectUnspecified)


(vlax-invoke-method RSObject "open" SqlString DBConnection nil nil adok-adcmdtext)
(setq DNTABLE (search rsobject))  ;;;返回点号这个字段下的列表
(DbCloseRecordset rsobject)
(DbCloseConnection dbconnection)
(princ))

 楼主| 发表于 2009-12-2 09:40:00 | 显示全部楼层

在线等,急需!

发表于 2009-12-2 10:12:00 | 显示全部楼层

试一下:

(vlax-invoke-method RSObject "open" SqlString DBConnection nil nil adok-adcmdtext)
(setq out (search rsobject))
(DbCloseRecordset rsobject)
(DbCloseConnection dbconnection)
(princ))

 楼主| 发表于 2009-12-2 16:34:00 | 显示全部楼层

最后一个问题

命令: (LOAD "d:/jiangmj/桌面/sql.lsp")
(("点号" ("0000" "1111" "2222" "3333" "4444")))

加载SQL.LSP后,自动在命令行显示这串(红色部分),如何让他不显示,我用了上述(setq out (search rsobject)) 的方法,还是会显示!

发表于 2009-12-2 16:37:00 | 显示全部楼层

(defun Search(RSObject / lst FieldsObject FieldCount FieldList ReturnValue)
(defun getlst    (var)
    (setq lst nil)
    (setq n (length var) i 0)
    (while (< i n)
      (setq lst (append lst (list (vlax-variant-value (nth i var)))))
      (setq i (1+ i))
    )
    lst
)
(setq    FieldsObject (DbRsFields RSObject)        ;; 将字段作为对象
    FieldCount   (DbRsFieldCount FieldsObject)        ;; 取得列的数量
    FieldList    (DbGetFields FieldsObject FieldCount)    ;; 取得列表中所有列的名称
    ReturnValue (list (reverse FieldList)))        ; setq
(setq    lst (vlax-safearray->list (vlax-variant-value (dbrsgetrows rsobject))))
(setq lst (mapcar 'getlst lst))
(setq lst (mapcar '(lambda(var1 var2) (append (list var1) (list var2))) (car returnvalue) lst))
(print lst) ;;去掉此句
)

 楼主| 发表于 2009-12-2 16:54:00 | 显示全部楼层
谢谢!等弄完这个,好好找本书学习!
 楼主| 发表于 2009-12-4 16:23:00 | 显示全部楼层
新问题又来了
发表于 2009-12-7 15:27:00 | 显示全部楼层
学习下 谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-1 19:39 , Processed in 0.205080 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表