天天看點

lisp操作access資料庫

    cad和資料庫連接配接,是個很有用的問題.最近實作了用visual lisp對access資料庫的操作,包括配置資料庫,讀/寫資料.

    先看資料庫:

    名稱:mc-sample.mdb,表名稱:circle.共id,x,y,z,r四個字段.其中id為序号,x,y,z為圓心坐标,r為圓半徑.

    欲實作:從該資料庫中取出所有記錄,在cad中以相應參數畫圓.

    把檔案mc-sample.mdb拷到autocad2004的支援檔案夾中(例如,我的是c:/program files/auotcad2004/support/).然後建立rw.lsp,其代碼如下:

    (vl-load-com)

(defun c:loadcircle(/ dbfile conn connstring sql rs resultlist count i pn)

  (setq dbfile (findfile "mc-sample.mdb")) ;設定資料庫名稱及路徑

  (Setq conn(vlax-create-object "ADODB.Connection")) ;引用ADO控件

  (setq connstring (strcat "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" dbfile)) ;設定資料庫連接配接字元串

  (vlax-invoke-method conn "open" connstring "" "" -1) ;打開資料庫連接配接

  (setq sql "select [id],[x],[y],[z],

­­ from [circle] order by [id]") ;設定查詢SQL

  (setq rs (vlax-invoke-method conn "Execute" sql nil -1)) ;執行資料庫查詢

  (if  (/= (vlax-get-property rs "EOF") :vlax-true) ;判斷有無資料

    (progn

      (setq resultlist (vlax-safearray->list (vlax-variant-value (vlax-invoke-method rs "GetRows" -1))));将傳回值變成清單

      (setq count(vl-list-length (car resultlist)));查詢清單長度,即記錄數

      (setq i 0)

      (repeat count

        (setq x (vlax-variant-value(nth i(cadr resultlist)));取X坐标

              y (vlax-variant-value(nth i(caddr resultlist)));取Y坐标

              z (vlax-variant-value(nth i(cadddr resultlist)));取Z坐标

              r (vlax-variant-value(nth i(nth 4 resultlist)));取R長度

              i (1+ i)

              )

        ;;(princ (strcat "/n"  (rtos x) "," (rtos y) "," (rtos z) "," (rtos r))) ;列出記錄内容

        (setq pn (list x y z)) ; 将XYZ組合成點坐标

        (command "_circle" pn r ) ;畫圓

      )

    )

  )

  (setq sql "insert into [circle] ([id],[x],[y],[z],[r]­) values(12,1,1,0,6)") ;插入記錄

  (setq rs (vlax-invoke-method conn "Execute" sql nil -1)) ;執行資料庫查詢

  (vlax-release-object rs);釋放記錄集

  (vlax-invoke-method conn "close");關閉資料庫連接配接

  (vlax-release-object conn);釋放資料庫連接配接

)

    如此,實作了lisp-access操作,下一步需要解決的,是用lisp操作sql server,畢竟access作為資料庫,還是太簡單了啊.