2013-04-08 56 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