abc498091367 发表于 2018-12-27 00:26:51

MYSQL数据库

(setq myRs (vlax-create-object "ADODB.Recordset"))
(Setq ConnectionObject(vlax-create-object "ADODB.Connection"))
(setq strCon (strcat "DRIVER={MySQL ODBC 8.0 Unicode Driver};UID=root;Password=123456;DATABASE=user_management;SERVER=192.168.1.101"))
        (setq userID "root" userPassword "123456")
(setq str11 (strcase (getstring "\n请输入:")))
(setq TempObject(vl-catch-all-apply'vlax-invoke-method(list ConnectionObject "Open" strCon userIDuserPassword ADOConstant-adConnectUnspecified)))
(vl-catch-all-apply'vlax-invoke-method(listmyRs "Open" (strcat "select * from nema WHERE nb='" str11 "'" ) TempObject 1 1 -1))
(if (= (vlax-get-property myRs "RecordCount") 0)
      (progn
                                (ALERT (strcat "未找到:" str11 "记录!"))
                                (EXIT)
                        )
                        (progn
                                (setq Result (ADOLISP_DoSQL ConnectionObject SQLStatement))
                        )
                )

我想实现,查找nb字段,如果输入的没有提示然后退出,有的话就继续执行。
上面代码有问题,请大老帮忙看看吗

Lisphk 发表于 2018-12-27 00:37:57

貌似用VLISP链接ODBC,只能在32位CAD下用

abc498091367 发表于 2018-12-27 12:22:25

Lisphk 发表于 2018-12-27 00:37
貌似用VLISP链接ODBC,只能在32位CAD下用

WIN10 64都可以连接成功。win7 64也可以

Lisphk 发表于 2018-12-27 13:02:35

abc498091367 发表于 2018-12-27 12:22
WIN10 64都可以连接成功。win7 64也可以

说的不是系统的位数,是ACAD的位数
32位版的ACAD

ACAD 2005,ACAD2006,.....ACAD2010 32位版....ACAD2019 32位版

abc498091367 发表于 2018-12-27 14:16:27

Lisphk 发表于 2018-12-27 13:02
说的不是系统的位数,是ACAD的位数
32位版的ACAD



哦, 现在上面的代码,可以连接,也可以读取。
我不知道怎么判断查找的字段是否存在。这个跟32位版的CAD有关系吗?

marting 发表于 2018-12-27 14:56:00

abc498091367 发表于 2018-12-27 14:16
哦, 现在上面的代码,可以连接,也可以读取。
我不知道怎么判断查找的字段是否存在。这个跟32位版的CAD ...

"select * from nema WHERE nb='" str11 "'"

这个是数据库查询语句,你要查啥改这里

后面加 like 判断字符串是否包含

select * from nema while nb like '%abc'

表示查找结尾是不是abc

select * from nema while nb like '%abc%'

表示查找中间是否包含abc

marting 发表于 2018-12-27 14:58:18

abc498091367 发表于 2018-12-27 14:16
哦, 现在上面的代码,可以连接,也可以读取。
我不知道怎么判断查找的字段是否存在。这个跟32位版的CAD ...

判断记录nb是否存在,你直接查询nb

"select nb from nema"

abc498091367 发表于 2018-12-27 18:01:55

marting 发表于 2018-12-27 14:58
判断记录nb是否存在,你直接查询nb

"select nb from nema"

(progn
        (setq SQLStatement (strcat "select * from nema while nb like '%abc%'"))
        (setq Result (ADOLISP_DoSQL ConnectionObject SQLStatement))
)
表名nb,有内容abc,但是查找后返回nil

abc498091367 发表于 2018-12-27 18:04:22

错了,是字段nb下有abc内容,但是查找后返回nil

abc498091367 发表于 2018-12-27 20:42:17

问题已解决,是WHERE 不是while

wzg356 发表于 2018-12-27 23:37:18

;主函数"ADOLISP_Library.lsp"在这儿http://bbs.xdcad.net/forum.php?m ... =%CA%FD%BE%DD%BF%E2
下面是实用化子函数,最后是操作示例
(if (not ADOLISP_ConnectToDB)
(load "ADOLISP_Library.lsp")
)
;-----------------------------------
获取一个全路径数据库文件
(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 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
                                        ff ";Persist Security Info=False")
                        )
                        (ADOLISP_ConnectToDB ConnectString "admin" kg);密码权限
                )
        )
);对象 or nil,每一次打开要与一次关闭对应
;----------------------------------
;关闭数据库
(defunDSQL_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')")
;注意,表里面字符用单引号(一般不支持双引号)
(defunDSQL_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)
        (strcat "('"
    (vl-string-right-trim
      "','" (apply 'strcat (mapcar '(lambda (x)(strcat x "','")) lst))
    )"')")
)
;字符串表转字符型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 "FFM3");获取表全部记录
                  ;(car(DSQL_SELECTall db "FFM3"));获取表字段
                  ;(DSQL_DELETErow db "aa");表删除全部记录,仅余表头
                  ;(DSQL_TABLE db "花名册" "(姓名 varchar(20),籍贯 varchar(20),年龄 int,工资 numeric(8,2))");创建表,arcgis创建的表,int,smallint分别为长、短整型,real为浮点数,FLOAT,DOUBLE,numeric均双精度
                  ;(ADOLISP_DoSQL db (strcat "DROP TABLE " "ff"));删除表,表名也没聊
                  ;(ADOLISP_DoSQL db (strcat "TRUNCATE TABLE " "ee"));删除表格数据,数据为null?
                  (DSQL_close db);关闭mdb
       )
)
)

wzg356 发表于 2018-12-27 23:49:55

本帖最后由 wzg356 于 2018-12-28 14:10 编辑

wzg356 发表于 2018-12-27 23:37
;主函数"ADOLISP_Library.lsp"在这儿http://bbs.xdcad.net/forum.php?m ... =%CA%FD%BE%DD%BF%E2
下面是实 ...
106行楼注释掉(apply 'strcat (mapcar '(lambda (x)(strcat x " varchar(20),")) lst))

abc498091367 发表于 2018-12-28 08:05:02

wzg356 发表于 2018-12-27 23:37
;主函数"ADOLISP_Library.lsp"在这儿http://bbs.xdcad.net/forum.php?m ... =%CA%FD%BE%DD%BF%E2
下面是实 ...

这个全面了,多谢

wzg356 发表于 2018-12-28 17:16:17

abc498091367 发表于 2018-12-28 08:05
这个全面了,多谢

你哪儿能否lisp创建一个空库?

wzg356 发表于 2018-12-28 17:18:55

Lisphk 发表于 2018-12-27 13:02
说的不是系统的位数,是ACAD的位数
32位版的ACAD



大师哪儿能否lisp创建一个空库?
页: [1] 2
查看完整版本: MYSQL数据库