office交流網--QQ交流群號

Access培訓群:792054000         Excel免費交流群群:686050929          Outlook交流群:221378704    

Word交流群:218156588             PPT交流群:324131555

使用ADO的OpenSchema或ADOX無法讀取所有Access數據庫里所有查詢名稱列表的問題

2017-09-07 16:31:00
zstmtony
原創
1823

一個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再處理了


    分享
    北京十一选五基本走势