2

我正在尝试创建一个 VB.NET 按钮,该按钮将连接到 MS Access 数据库并获取存储在 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

在我正在处理的程序中,这是在 VB6 中通过使用 .Containers("Scripts") 和 DAO.Database 获得的。任何帮助,将不胜感激!

4

1 回答 1

3

起初我认为这将是执行查询的简单问题

SELECT [Name] FROM MSysObjects WHERE Type = -32766

但由于“对 MSysObjects 没有读取权限”而失败。OLEDB 似乎可以访问被锁得很紧的系统表。我什至尝试做 aCREATE VIEW listMacros AS SELECT [Name] FROM MSysObjects...后跟 a 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....)

于 2013-04-08T20:31:01.750 回答