明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2130|回复: 1

请教如何通过ADO+LISP获取MDB的所有表名 (已解决)

[复制链接]
发表于 2011-12-28 21:24:13 | 显示全部楼层 |阅读模式
本帖最后由 cheng5276 于 2011-12-29 00:10 编辑

泣血求教,恳请大侠们指点

在ACCESS中,可以直接通过"SELECT MSysObjects.Name FROM MsysObjects" sql语句来取得所有表名的列表
但是当通过LISP+ADO的以下两种方法时,都提示无此权限,恳请老大们指点!
(setq SqlString  "SELECT MSysObjects.Name FROM MsysObjects")
1、方法一   (vlax-invoke-method RSObject "open" SqlString DBConnection nil nil adok-adcmdtext)
2、方法二   (vlax-invoke-method DBConnection "Execute" SqlString nil -1)


这个是网上的一段VB代码,本想参照这个改写
3、方法三  (setq rs (Vlax-Invoke-Method DBConnection "OpenSchema" adSchemaTables))  提示“无效的参数数目”


  1. Private   Sub   Form_Load()
  2. Dim   adoCN   As   New   ADODB.Connection               '定义数据库的连接存放数据和代码Dim   rstSchema
  3. Dim   strCnn   As   New   ADODB.Recordset
  4.             
  5.     str1   =   "Provider=SQLOLEDB.1;Password=sa;Persist   Security   Info=True;User   ID=sa;Initial   Catalog=wktrade;Data   Source=net5 "
  6.     adoCN.Open   str1
  7.         
  8.     Set   rstSchema   =   adoCN.OpenSchema(adSchemaTables)
  9.    
  10.     Do   Until   rstSchema.EOF
  11.             out   =   out   &   "Table   name:   "   &   _
  12.                 rstSchema!TABLE_NAME   &   vbCr   &   _
  13.                 "Table   type:   "   &   rstSchema!TABLE_TYPE   &   vbCr
  14.             rstSchema.MoveNext
  15.     Loop
  16.     rstSchema.Close
  17.    
  18.     adoCN.Close
  19. Debug.Print   out
  20. End   Sub



 楼主| 发表于 2011-12-28 23:59:26 | 显示全部楼层
本帖最后由 cheng5276 于 2011-12-29 00:06 编辑

折腾了一个晚上终于找到原因了,现贴出方法如下:
(方法一、二均可以,以下为方法二的源码。虽然这种方法成功了,毕竟需要一个事先设置权限的步骤,还是恳请大侠能够指点下方法三的写法,在此拜谢)


;ADO取得所有表名

;不成功的原因:默认的情况admin对MSysObjects没有任何权限!包括查询
;所以必须修改admin对MSysObjects的权限设置
;1、access2003 (工具 -> 选项 -> 视图 -> 隐藏对象、系统对象 前面的勾选上;
;2、工具 -> 安全 -> 用户与组的权限 设置其权限其权限MSysObjects
;3、access2007  (Office按钮 再点"Access选项"-->"当前数据库"==>"导航" )-》修改权限。
;4、设好权限后,为简洁可再将系统表进行隐藏。

(DEFUN CHENG5276-ADO-get-tablenames (DBConnection / lst recordlst rsobject sqlstring)
(setq SqlString "SELECT MSysObjects.Name FROM MsysObjects") ;检索所有表的SQL语句(含系统表)
(setq rsObject (vlax-invoke-method DBConnection "Execute" SqlString nil -1));核心函数,引自明总
(setq recordlst (car (vlax-safearray->list (vlax-variant-value (vlax-invoke-method rsObject "GetRows" -1)))))
(cheng5276-ADO-CloseRecordset rsObject);关闭
(setq lst (mapcar 'vlax-variant-value recordlst))
)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 17:35 , Processed in 0.163339 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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