- 积分
- 23297
- 明经币
- 个
- 注册时间
- 2012-10-14
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 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
评分
-
查看全部评分
|