明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4914|回复: 7

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

[复制链接]
发表于 2007-1-15 16:53:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-1-15 16:57:10 编辑

在VLISP中使用数据库(一)通过数据库保存的坐标画圆
讲到VLISP连接数据库,在网上真的少见到例子,而本站之前也有朋友给大家展示过一些例子,但都没有全面展示。
其实通过VLISP连接使用数据库是一件非常简单的事情,除是连接数据库外,就都是SQL的东西了,所以只要大家用点心,相信不会有什么难度。
以下给大家一个简单的例子,看看是否非常简单。
本例子并没有设置出错判断,以后会慢慢加上。
说明:本例子是通过SQL查询的方式,直接使用Execute方法来执行查询语句,再经过GetRows直接得到结果的数组,再经过转换变成了LISP中的表格式使用。
由于转换出来的表格式刚好与数据库相反(即本来应该是每行为一个记录,但在表中却是每列一个记录),所以最后的处理比较麻烦一些。
  1. (vl-load-com)
  2. (defun c:loadcircle(/ dbfile conn connstring sql rs resultlist count i pn)
  3.   (setq dbfile (findfile "mc-sample.mdb")) ;设置数据库名称及路径
  4.   (Setq conn(vlax-create-object "ADODB.Connection")) ;引用ADO控件
  5.   (setq connstring (strcat "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" dbfile)) ;设置数据库连接字符串
  6.   (vlax-invoke-method conn "open" connstring "" "" -1) ;打开数据库连接
  7.   (setq sql "select [id],[x],[y],[z],[r] from [circle] order by [id]") ;设置查询SQL
  8.   (setq rs (vlax-invoke-method conn "Execute" sql "" -1)) ;执行数据库查询
  9.   (if  (/= (vlax-get-property rs "EOF") :vlax-true) ;判断有无数据
  10.     (progn
  11.       (setq resultlist (vlax-safearray->list (vlax-variant-value (vlax-invoke-method rs "GetRows" -1))));将返回值变成列表
  12.       (setq count(vl-list-length (car resultlist)));查询列表长度,即记录数
  13.       (setq i 0)
  14.       (repeat count
  15.         (setq x (vlax-variant-value(nth i(cadr resultlist)));取X坐标
  16.               y (vlax-variant-value(nth i(caddr resultlist)));取Y坐标
  17.               z (vlax-variant-value(nth i(cadddr resultlist)));取Z坐标
  18.               r (vlax-variant-value(nth i(nth 4 resultlist)));取R长度
  19.               i (1+ i)
  20.               )
  21.         ;;(princ (strcat "\n"  (rtos x) "," (rtos y) "," (rtos z) "," (rtos r))) ;列出记录内容
  22.         (setq pn (list x y z)) ; 将XYZ组合成点坐标
  23.         (command "_circle" pn r ) ;画圆
  24.       )
  25.     )
  26.   )
  27.   (vlax-release-object rs);释放记录集
  28.   (vlax-invoke-method conn "close");关闭数据库连接
  29.   (vlax-release-object conn);释放数据库连接
  30. )
本例子中使用的数据库,请解压到AutoCAD的支持目录中:  

这是程序运行后的结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 明经币 +2 金钱 +5 贡献 +5 激情 +5 收起 理由
龙龙仔 + 1 + 2 + 5 + 5 + 5 【好评】好程序 請再多多說明 8-)

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-1-15 17:07:00 | 显示全部楼层

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

发表于 2007-1-16 21:47:00 | 显示全部楼层

顶!

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

发表于 2009-4-29 10:23:00 | 显示全部楼层
请问各位,我如果要用楼主的例子,是不是必须装微软的ACCESS程序?如果装,需什么版本?
发表于 2009-4-29 11:56:00 | 显示全部楼层

支持一下原创!期待(二)

发表于 2010-6-27 00:01:00 | 显示全部楼层
本帖最后由 作者 于 2010-6-27 13:31:08 编辑

我用的是AUTOCAD2005, ACCESS2003, 代码运行到  (setq rs (vlax-invoke-method conn "Execute" sql "" -1)) ;执行数据库查询

的时候,提示说 ; 错误: Automation 错误。 类型不匹配。请问这是怎么回事?

 

我又看了很多帖子,修改了一点就成功了。 (setq rs (vlax-invoke-method conn "Execute" sql nil -1))

就是把""变成nil。程序就通过了。

我对vlax函数不懂,请知道的大侠解释下,是不是系统通用性的问题。

发表于 2012-6-29 11:52:31 | 显示全部楼层
第6行执行后也返回了nil, 是什么原因
发表于 2015-3-3 11:15:57 | 显示全部楼层
如何读写远程数据库呢?这个功能好像目前还没有,都是本地数据库。如果能实现读写远程数据库,请指点一下思路,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-14 21:09 , Processed in 0.207026 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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