การใช้ 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
ใช้คำตอบนี้และโค้ดบางส่วนเพื่อสร้าง marshal วัตถุการเข้าถึงจาก บทความสนับสนุนของ Microsoft นี้ ฉันคิดว่านี่เป็นทางออกที่ดีที่สุด - person Pow-Ian; 09.04.2013