使用ADO的OpenSchema或ADOX无法读取所有Access数据库里所有查询名称列表的问题

2017-09-07 16:31:00
zstmtony
原创
196

一个Access中国的版主在使用ADO的OpenSchema或ADOX 读取Access数据库里所有查询的清单时

发现结果总是少了一个查询,Access查询列表中有5个,但用VBA 或VB代码读出来只有4个,少了一个


ADO读取Access数据库所有查询名的代码如下


Private Sub OpenDBSchema(FileName As String)
    Dim conn As New ADODB.Connection
    Dim mProvider As String
    Dim fso As New FileSystemObject
    If Not fso.FileExists(FileName) Then Set grid1.DataSource = Nothing
    Select Case LCase(fso.GetExtensionName(FileName))
    Case "mdb"
        mProvider = "Microsoft.Jet.OLEDB.4.0"
    Case "accdb"
        mProvider = "Microsoft.ACE.OLEDB.12.0"
    End Select
    conn.ConnectionString = "Provider=" & mProvider & ";Data Source=" & FileName & ";Persist Security Info=False;"
    conn.Open
    Set grid1.DataSource = conn.OpenSchema(adSchemaTables)
    grid1.AllowUserResizing = flexResizeBoth
End Sub


出现 的错误如下(ADO VBA代码取得的结果与Access数据库查询实际对比)


经过不断尝试与分析,终于发现,原来这个少掉的Access查询,使用了一个Access模块中的自定义函数

这样导致 无法识别到这个查询

将查询中用到的自定义函数删除后,则成功获取了






吐槽】064-姚文涛-10年(21959068)  14:30:49
我得翻翻,好久之前的事情了,一直没结果,代码不知道放哪去了
等等,我现写一下看看
【话唠】ZPY2(1928323988)  14:40:06
set xCat = Server.CreateObject("ADOX.Catalog")
if xCat Is Nothing or IsEmpty(xCat) or not UseADOX Then
'ADOX is not available, so we'll get tables list using schemas
set xCat = JetConnection_.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, Empty))
Do While Not xCat.EOF
tableType = xCat("TABLE_TYPE").Value
If tableType = "SYSTEM TABLE" or tableType = "TABLE" or tableType = "ACCESS TABLE" or tableType = "LINK" _
or tableType = "PASS-THROUGH" Then
set tbl = new DBATable
With tbl
.Name =	xCat("TABLE_NAME").Value
.DateCreated =	xCat("DATE_CREATED").Value
.DateModified = xCat("DATE_MODIFIED").Value
.Description =	xCat("DESCRIPTION").Value
.TableType =	xCat("TABLE_TYPE").Value
Set .Parent = Me
End With
Set Tables_.Item(tbl.Name 
) = tbl
End If
xCat.MoveNext
Loop
call xCat.Close()
end if

【吐槽】064-姚文涛-10年(21959068)  14:41:31

这个结果输出时对的
【吐槽】064-姚文涛-10年(21959068)  14:43:22
有些时候没问题,有些时候又有问题,当初那个问题数据库我找不到了
【话唠】席主习_smileyoufu(86053924)  14:44:38
你列出有问题的例子来
【管理员】tmtony小辣椒(18449932)  14:44:56
用ADOX 也会这样?
【话唠】ZPY2(1928323988)  14:47:01
不会的,
【吐槽】064-姚文涛-10年(21959068)  14:47:56
我翻翻看看,难道是我当初导出到datagridview之后眼睛看花了
【话唠】席主习_smileyoufu(86053924)  14:50:23
几十年的东西,别轻易说有问题
【吐槽】064-姚文涛-10年(21959068)  15:20:01


少了一个z开头的查询
【吐槽】064-姚文涛-10年(21959068)  15:25:15

这是另一个,也少一个查询
【吐槽】064-姚文涛-10年(21959068)  15:26:28
我这是Ado.net
的测试结果,Ado似乎也一样,总是会莫名其妙少几个查询
【话唠】席主习_smileyoufu(86053924)  15:42:01
这是.net 不会用
【管理员】tmtony小辣椒(18449932)  15:43:28
@064-姚文涛-10年 建议弄个vb6+ado+mdb数据库 上来,大家来测试一下
【吐槽】064-姚文涛-10年(21959068)  15:43:46
好,等等

【话唠】ZPY2(1928323988)  16:04:21

【吐槽】064-姚文涛-10年(21959068)  16:04:39
【管理员】tmtony小辣椒(18449932)  16:04:45
@ZPY2 截图不清
【吐槽】064-姚文涛-10年(21959068)  16:05:01
上传了VB6的工程文件
里面有个数据库
【话唠】ZPY2(1928323988)  16:05:11
查询和表,参数不一样
【吐槽】064-姚文涛-10年(21959068)  16:05:11
读取之后少个查询
【话唠】ZPY2(1928323988)  16:07:30
view oledbschemaguid.tables  这个参数
【吐槽】064-姚文涛-10年(21959068)  16:07:43
就是这个OleDbSchemaGuid.Tables,控制是否是查询还是表,是后面那个object里的值控制的
【管理员】tmtony小辣椒(18449932)  16:08:16
@064-姚文涛-10年  少了哪个查询名?
【吐槽】064-姚文涛-10年(21959068)  16:09:12

【话唠】ZPY2(1928323988)  16:11:47
我是ado的,
【吐槽】064-姚文涛-10年(21959068)  16:11:49

我上传VB6工程,用的ADO

一样的问题
【吐槽】064-姚文涛-10年(21959068)  16:14:08
我上次还发现一个有好多查询都找不到的,不过我实在是翻不到那个数据库了
【活跃】新手(1742595842)  16:21:38
你的查询表在access里面可以打开吗?
我在你的access里面打不开你查询不到的那个表
【管理员】tmtony小辣椒(18449932)  16:27:35

@064-姚文涛-10年 原因找到了
【吐槽】064-姚文涛-10年(21959068)  16:27:56
啥原因?
【管理员】tmtony小辣椒(18449932)  16:28:09
因为你这个查询使用了access模块的自定义函数,所以取不到
把这个函数中用的自定义函数取消,就可能了
【话唠】ZPY2(1928323988)  16:28:49
老大厉害
【吐槽】064-姚文涛-10年(21959068)  16:29:11
哦,终于知道原因了,迷惑了我好久
那我又想要那个自定义函数的查询,咋办啊
【话唠】ZPY2(1928323988)  16:29:33
自定义函数 只能在 access vba执行,
【管理员】tmtony小辣椒(18449932)  16:30:02
这个你可在Access使用时动态 设置qdf.sql
但这个查询在VB调用肯定用不了这个函数的
【话唠】ZPY2(1928323988)  16:31:43
是啊,
【吐槽】064-姚文涛-10年(21959068)  16:33:04
如果是动态设置Sql,是不是要将自定义函数的这个模块保存在VB6工程项目里?
【管理员】tmtony小辣椒(18449932)  16:34:07
Access的查询是无法读取VB的自定义函数的:)
这个是不太好解决,DAO则可以
你只有在VB中了到查询内容,再用VB再处理了


    分享