明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2624|回复: 9

[资源] 读写数据库mdb,实用化实用化SQLmdb函数

[复制链接]
发表于 2020-10-23 10:22:38 | 显示全部楼层 |阅读模式
本帖最后由 wzg356 于 2020-10-23 10:33 编辑

;主函数"ADOLISP_Library.lsp"在这儿http://bbs.xdcad.net/forum.php?m ... =%CA%FD%BE%DD%BF%E2

;以下为实用化的一些函数
;获取一个全路径数据库文件
(defun getdb ( / desk)
(setq desk
            (vlax-invoke-method (vlax-get-property
                    (vlax-create-object "wscript.shell")
                     'SpecialFolders) 'Item  "desktop"));获取桌面路径
    (getfiled "选择mdb文件" (strcat desk "\\") "mdb" 8)
);全路径文件名 or nil
;--------------------------------------------            
;打开数据库
;(DSQL_OPEN (getdb) "密码")
(defun DSQL_OPEN (ff kg / ConnectString)
        (if ff
                (progn
                        (setq ConnectString
                                (strcat "rovider=Microsoft.Jet.OLEDB.4.0;Data Source="
                                        ff "ersist Security Info=False")
                        )
                        (ADOLISP_ConnectToDB ConnectString "admin" kg);密码权限
                )
        )
);对象 or nil,每一次打开要与一次关闭对应

;----------------------------------
;关闭数据库
(defun  DSQL_close (db / )
        (ADOLISP_DisconnectFromDB db)
        (setq db nil)
)

;------------------------------
;输出表记录集
;使用示例
;(SETQ db (DSQL_OPEN(getdb)""))
;(DSQL_SELECTall db "表名")
;以表的形式输出表内容
(defun DSQL_SELECTall (db table /  )      
    (ADOLISP_DoSQL db
            (strcat "SELECT * FROM  " table ";")
        )
);含表头lst or nil,可判表是否存在

;---------------------------
;插入一行记录
;strlst:"(值1 值2 值3.。。。。)"值类型要与字段定义匹配
;(DSQL_Insertrow db "表名" "(1,'2e','3p','33')")
;注意,表里面字符用单引号(一般不支持双引号)
(defun  DSQL_Insertrow (db table vlst /  )
    (ADOLISP_DoSQL db
            (strcat "INSERT INTO " table  " VALUES "  vlst ";")
         )
);t or nil

;-------------------------------
;删除所有行
(defun DSQL_DELETErow (db table  / )     
      (ADOLISP_DoSQL db
              (strcat "DELETE FROM  " table ";")
           )
);仅余表头
;(ADOLISP_DoSQL db (strcat "DROP TABLE " 表名));删除表,表名也没聊
;(ADOLISP_DoSQL db (strcat "TRUNCATE TABLE " 表名));删除表格数据,数据为null?

;-----------------------------
; 创建一个表
;strlst:"(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....)"
;"(Id_P int,Name varchar(255),mianji numeric(8,2))"
(defun DSQL_TABLE (db table strlst / )
        (if db      
      (ADOLISP_DoSQL db
              (strcat "CREATE TABLE  " table "  " strlst ";")
           )
   )
); t or nil
;创建索引 (ADOLISP_DoSQL db "CREATE INDEX index_name ON table_name (column_name)")

;------------------------------
;改某列数据类型
;其实仅该长度(精度)也可以
;arcgis创建的表,int,smallint分别为长、短整型,real为浮点数,FLOAT,DOUBLE,numeric均双精度
;(SETQ db (DSQL_OPEN(getdb)""))
;(DSQL_datatype db "aa" "mianji varchar(20)")
;(DSQL_close db)
(defun DSQL_datatype (db table strs / )
        (if db      
      (ADOLISP_DoSQL db
              (strcat "ALTER TABLE  " table " ALTER COLUMN " strs ";")
           );"ALTER COLUMN column_name datatype"
   )
); t or nil

;------------------------------------
;其他,
;(ADOLISP_DoSQL db "alter table FFM3 add column LLMJ varchar(20);")加一列,测试成功
;(ADOLISP_DoSQL db "alter table FFM3 drop column LLMJ;")删一列,测试成功
;"CREATE UNIQUE INDEX index_nameON table_name (column_name)"在表上创建一个唯一的索引
;"DROP INDEX index_name ON table_name"删除表格中的索引
;------------------------------------


;附2个工具函数
;字符数字表转为SQL格式用字符串, 插入记录用
; (lst2SQL1 '("1" 2 "3" 4))
;==> "('1',2,'3',4)"
(defun lst2SQL1 (lst / str)
        (setq str "")
        (strcat "("
            (vl-string-right-trim ","
                    (foreach n lst
                            (if(=(type n)'STR)
                                    (setq str(strcat str "'" n "',"))
                                    (setq str(strcat str (vl-princ-to-string n) ","))
                                )
                        )
                ) ")"
        )
)
;字符串表转字符型SQL字段表,创建表用
; (lst2SQL2 '("姓名" "籍贯" "工作地"))
;(apply 'strcat (mapcar '(lambda (x)(strcat x " varchar(20),")) lst))
(defun lst2SQL2 (lst)
        (strcat "("
    (vl-string-right-trim
        "," (apply 'strcat (mapcar '(lambda (x)(strcat x " varchar(50),")) lst))
    )")")
);写函数费事,这样创建后可以通过修改字段列数据类型达到自己要求

;-------------------------------------------
;;; 实用化示例
(DEFUN C:ttt ( / db)
  (if(SETQ db (DSQL_OPEN(getdb)""));指定mdb并打开
          (progn
                  ;(car(ADOLISP_GetTablesAndViews db));表名集
                  (ADOLISP_GetColumns db "aa");表aa的字段信息:类型,长度,读写限制,精度,次序?                  
                  ;(DSQL_Insertrow db "aa" "(2,'2f','cdg5')");表插入一行
                  ;(DSQL_SELECTall db "花名册");获取表全部记录
                  ;(car(DSQL_SELECTall db "zd"));获取表字段
                  ;(DSQL_DELETErow db "aa");表删除全部记录,仅余表头
                  ;(DSQL_TABLE db "花名册" "(姓名 varchar(20),籍贯 varchar(20),年龄 int,工资 numeric(8,2))");
                  ;创建表,arcgis创建的表,int,smallint分别为长、短整型,real为浮点数,FLOAT,DOUBLE,numeric均双精度
                  ;(DSQL_Insertrow db "花名册" (lst2SQL1 '("李四" "新疆" 23 4350)))
                  ;(ADOLISP_DoSQL db (strcat "DROP TABLE " "ff"));删除表,表名也没聊
                  ;(ADOLISP_DoSQL db (strcat "TRUNCATE TABLE " "ee"));删除表格数据,数据为null?
                  ;上面为具体的数据库读写操作,根据需要放上
                  (DSQL_close db);关闭mdb,这一步是必须的
         )
  )
)
在操作实务上,以列操作更方便,因为每列对应一个字段,其数据类型是一样的,这样就只对字符型数据转换成数据库接受的单引号格式就行了






本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

 楼主| 发表于 2020-10-23 10:44:40 | 显示全部楼层
本帖最后由 wzg356 于 2020-10-23 10:48 编辑

创建一个空库
晓东的大佬写的
;用ADOX创建数据库
;( XD::MDB:Create "C:\\Documents and Settings\\Administrator\\桌面\\cc.mdb")
(defun XD::MDB:Create (name / ConObj ConStr1 ConStr2 ver1)
  (if (not (findfile name))
    (progn (setq ConObj  (vlax-create-object "ADOX.Catalog")
                 ConStr1 (strcat "Provider=Microsoft.ACE.OLEDB.12.0;"
                                 "Data Source="
                                 name
                         )
                 ConStr2 (strcat "Provider=Microsoft.Jet.OLEDB.4.0;"
                                 "Data Source="
                                 name
                         )
           )
           (setq ver1 (getvar "acadver")
                 ver1 (substr ver1 1 4)
           )
           (if (< (atof ver1) 18)
             (vlax-invoke-method ConObj 'Create ConStr2)
             (vlax-invoke-method ConObj 'Create ConStr1)
           )
           (vlax-release-object ConObj)
           (gc)
           (if (not (findfile name))
             (setq name nil)
           )
    )
  )
  name
)这样,就可以结合主贴的函数,把cad的数据建库了
修改等等的事可以完全在CAD平台完成,更新数据库文件即可,这样更省事。
发表于 2020-10-26 21:38:36 | 显示全部楼层
;主函数"ADOLISP_Library.lsp"在这儿http://bbs.xdcad.net/forum.php?m ... =%CA%FD%BE%DD%BF%E2
网站不全

附件内容有问题
 楼主| 发表于 2020-10-27 18:49:17 | 显示全部楼层
crtrccrt 发表于 2020-10-26 21:38
;主函数"ADOLISP_Library.lsp"在这儿http://bbs.xdcad.net/forum.php?m ... =%CA%FD%BE%DD%BF%E2
网站不全 ...

链接主要表明出处,
附件已贴主函数,我用的没问题啊,你也可以用文件名在论坛搜
发表于 2020-10-28 08:39:00 | 显示全部楼层
重新测试,附件没问题了.
发表于 2022-2-15 23:26:54 | 显示全部楼层
感谢楼主分享
发表于 2022-2-16 16:32:20 | 显示全部楼层
受64位32位CAD限制不
发表于 2022-11-27 14:17:57 | 显示全部楼层
请问有没有VBa的创建数据库,64位限制
 楼主| 发表于 2022-11-27 16:17:47 来自手机 | 显示全部楼层
以前工作相关试水,没在关注这块了
发表于 2022-11-29 11:10:01 | 显示全部楼层
这个程序看起来很高端,但我安装的是office2016  cad是2020  运行的结果是文件里面什么都没有  即使我把ttt程序里面的备注全部取消了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 11:13 , Processed in 0.189157 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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