Использование 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

В программе, над которой я работаю, это было получено в VB6 с помощью .Containers ("Scripts") с DAO.Database. Любая помощь будет оценена по достоинству!


person user1943219    schedule 08.04.2013    source источник
comment
Разве вы не можете просто перебрать массив userTables.Rows, используя оператор For Each?   -  person Tom F    schedule 08.04.2013


Ответы (1)


Сначала я думал, что это будет простой вопрос выполнения запроса

SELECT [Name] FROM MSysObjects WHERE Type = -32766

но это не удается с «нет разрешения на чтение для MSysObjects». OLEDB, кажется, имеет доступ к системным таблицам, заблокированным довольно жестко. Я даже пытался сделать CREATE VIEW listMacros AS SELECT [Name] FROM MSysObjects..., а затем SELECT * FROM listMacros. VIEW (Query) был успешно создан, но OLEDB по-прежнему сообщал мне, что мне не разрешено читать [MSysObjects].

облом.

Тем не менее, я немного поиграл с кодом VBA в Excel, и у меня это заработало...

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....)

person Gord Thompson    schedule 08.04.2013
comment
используя этот ответ и часть кода для создания маршала объекта доступа из этой статьи службы поддержки Microsoft Я думаю, что это лучшее решение. - person Pow-Ian; 09.04.2013