请教如何通过ADO+LISP获取MDB的所有表名 (已解决)
本帖最后由 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))提示“无效的参数数目”
Private Sub Form_Load()
Dim adoCN As New ADODB.Connection '定义数据库的连接存放数据和代码Dim rstSchema
Dim strCnn As New ADODB.Recordset
str1 = "Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=wktrade;Data Source=net5 "
adoCN.Open str1
Set rstSchema = adoCN.OpenSchema(adSchemaTables)
Do Until rstSchema.EOF
out = out & "Table name: " & _
rstSchema!TABLE_NAME & vbCr & _
"Table type: " & rstSchema!TABLE_TYPE & vbCr
rstSchema.MoveNext
Loop
rstSchema.Close
adoCN.Close
Debug.Print out
End Sub
本帖最后由 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))
)
页:
[1]