mccad 发表于 2007-1-15 16:53:00

在VLISP中使用数据库(一)通过数据库保存的坐标画圆

本帖最后由 作者 于 2007-1-15 16:57:10 编辑

在VLISP中使用数据库(一)通过数据库保存的坐标画圆
讲到VLISP连接数据库,在网上真的少见到例子,而本站之前也有朋友给大家展示过一些例子,但都没有全面展示。
其实通过VLISP连接使用数据库是一件非常简单的事情,除是连接数据库外,就都是SQL的东西了,所以只要大家用点心,相信不会有什么难度。
以下给大家一个简单的例子,看看是否非常简单。
本例子并没有设置出错判断,以后会慢慢加上。
说明:本例子是通过SQL查询的方式,直接使用Execute方法来执行查询语句,再经过GetRows直接得到结果的数组,再经过转换变成了LISP中的表格式使用。
由于转换出来的表格式刚好与数据库相反(即本来应该是每行为一个记录,但在表中却是每列一个记录),所以最后的处理比较麻烦一些。
(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 ,,,, from order by ") ;设置查询SQL
(setq rs (vlax-invoke-method conn "Execute" sql "" -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 ) ;画圆
      )
    )
)
(vlax-release-object rs);释放记录集
(vlax-invoke-method conn "close");关闭数据库连接
(vlax-release-object conn);释放数据库连接
)
本例子中使用的数据库,请解压到AutoCAD的支持目录中:

这是程序运行后的结果:

njcknfy 发表于 2007-1-15 17:07:00

<p>要是有如何在图上修改后再写回数据库的范例就好了,可否赐教</p>

tchen 发表于 2007-1-16 21:47:00

<p>顶!</p><p>希望斑竹循序渐进的把所有的LISP操作ACCESS数据库串烧起来!</p>

jingweirensh 发表于 2009-4-29 10:23:00

请问各位,我如果要用楼主的例子,是不是必须装微软的ACCESS程序?如果装,需什么版本?

c3a139 发表于 2009-4-29 11:56:00

<p>支持一下原创!期待(二)</p>

yucpp 发表于 2010-6-27 00:01:00

本帖最后由 作者 于 2010-6-27 13:31:08 编辑 <br /><br /> <p>我用的是AUTOCAD2005, ACCESS2003, 代码运行到&nbsp;<strong> (setq rs (vlax-invoke-method conn "Execute" sql "" -1)) ;执行数据库查询</strong></p>
<p>的时候,提示说<strong> <font style="BACKGROUND-COLOR: #ffffff" face="Verdana">; 错误: Automation 错误。 类型不匹配。</font></strong>请问这是怎么回事?</p>
<p>&nbsp;</p>
<p>我又看了很多帖子,修改了一点就成功了。 <strong>(setq rs (vlax-invoke-method conn "Execute" sql&nbsp;<font color="#ff0000">nil </font>-1)) </strong></p>
<p><strong>就是把""变成nil。程序就通过了。</strong></p>
<p><strong>我对vlax函数不懂,请知道的大侠解释下,是不是系统通用性的问题。</strong></p>

暴风影音 发表于 2012-6-29 11:52:31

第6行执行后也返回了nil, 是什么原因

革天明 发表于 2015-3-3 11:15:57

如何读写远程数据库呢?这个功能好像目前还没有,都是本地数据库。如果能实现读写远程数据库,请指点一下思路,谢谢!
页: [1]
查看完整版本: 在VLISP中使用数据库(一)通过数据库保存的坐标画圆