2013-04-08 101 views
1

我想創建一個VB.NET按鈕,它將連接到MS Access數據庫並獲取存儲在訪問數據庫中的所有宏的列表。使用VB.NET獲取MS Access中的宏

我有了清單後,我想在組合框中顯示值。我在網上發現了類似於我想要做的事情,但是我找不到任何能夠給我一個宏列表的東西。

Dim userTables As DataTable = Nothing 
Dim connection As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection() 
Dim source As String 
source = TextDBPath.Text 
connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + source 
    Dim restrictions() As String = New String(3) {} 
restrictions(3) = "Table" 
connection.Open() 
' Get list of user tables 
userTables = connection.GetSchema("Tables", restrictions) 
connection.Close() 
' Add list of table names to listBox 
Dim i As Integer 
For i = 0 To userTables.Rows.Count - 1 Step i + 1 
    cbox.items.add(userTables.Rows(i)(2).ToString()) 
Next 

在我正在開發的程序中,這是通過使用.Containers(「腳本」)與DAO.Database在VB6中獲得的。任何幫助,將不勝感激!

+0

難道你不能只使用For Each語句遍歷userTables.Rows數組嗎? – 2013-04-08 19:41:57

回答

2

起初我還以爲這將是執行查詢

SELECT [Name] FROM MSysObjects WHERE Type = -32766 

的一個簡單的問題,而是一種失敗,「關於MSysObjects沒有讀取權限。」 OLEDB似乎可以訪問非常緊密鎖定的系統表。我甚至試圖做一個CREATE VIEW listMacros AS SELECT [Name] FROM MSysObjects...,然後是SELECT * FROM listMacros。 VIEW(查詢)已成功創建,但OLEDB仍告訴我,我不允許閱讀[MSysObjects]。

無賴。

不過,我做了一些鬼混在Excel中使用VBA代碼,我得到這個工作...

Sub listAccessMacros() 
Dim objAccess As Object '' Access.Application 
Dim i As Long 
Set objAccess = CreateObject("Access.Application") 
objAccess.OpenCurrentDatabase "C:\Documents and Settings\Administrator\Desktop\Database1.accdb" 
For i = 0 To objAccess.CurrentProject.AllMacros.Count - 1 
    Debug.Print objAccess.CurrentProject.AllMacros(i).Name 
Next 
objAccess.CloseCurrentDatabase 
objAccess.Quit 
Set objAccess = Nothing 
End Sub 

...所以也許你可以想出一個辦法來調整它,所以它會在VB.NET中工作。 (對不起,但我沒有準備好訪問VB.NET我自己....)

+1

使用此答案和一些代碼來創建來自[此Microsoft支持文章](http://support.microsoft.com/kb/306682)的訪問對象編組我認爲這是最好的解決方案。 – 2013-04-08 20:35:55

+0

這工作完美! – user1943219 2013-04-08 21:12:29