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字段,如果输入的没有提示然后退出,有的话就继续执行。
上面代码有问题,请大老帮忙看看吗
貌似用VLISP链接ODBC,只能在32位CAD下用 Lisphk 发表于 2018-12-27 00:37
貌似用VLISP链接ODBC,只能在32位CAD下用
WIN10 64都可以连接成功。win7 64也可以 abc498091367 发表于 2018-12-27 12:22
WIN10 64都可以连接成功。win7 64也可以
说的不是系统的位数,是ACAD的位数
32位版的ACAD
ACAD 2005,ACAD2006,.....ACAD2010 32位版....ACAD2019 32位版 Lisphk 发表于 2018-12-27 13:02
说的不是系统的位数,是ACAD的位数
32位版的ACAD
哦, 现在上面的代码,可以连接,也可以读取。
我不知道怎么判断查找的字段是否存在。这个跟32位版的CAD有关系吗? 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
abc498091367 发表于 2018-12-27 14:16
哦, 现在上面的代码,可以连接,也可以读取。
我不知道怎么判断查找的字段是否存在。这个跟32位版的CAD ...
判断记录nb是否存在,你直接查询nb
"select nb from nema"
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 错了,是字段nb下有abc内容,但是查找后返回nil 问题已解决,是WHERE 不是while ;主函数"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-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)) wzg356 发表于 2018-12-27 23:37
;主函数"ADOLISP_Library.lsp"在这儿http://bbs.xdcad.net/forum.php?m ... =%CA%FD%BE%DD%BF%E2
下面是实 ...
这个全面了,多谢 abc498091367 发表于 2018-12-28 08:05
这个全面了,多谢
你哪儿能否lisp创建一个空库? Lisphk 发表于 2018-12-27 13:02
说的不是系统的位数,是ACAD的位数
32位版的ACAD
大师哪儿能否lisp创建一个空库?
页:
[1]
2