Hallo zusammen,
für ein kleines Datensicherungsprogramm suche ich eine Möglichkeit, eine Accessdatenbank bzw. deren Tabellen darauf hin zu untersuchen, ob es Tabellen gibt, die in einer anderen Datenbank stehen und in der Frontenddatenbank also nur verknüpft sind.
Mit diesen Pfaden würde ich dann auch diese mit sichern und somit alle benötigten Datenbanken sichern können. Wenn es möglich ist, dann wäre mir ACCDB und MDB Datenbanken sehr recht.
Ich habe hierzu schon einiges probiert, aber leider nie den Verknüpfungspfad der jeweiligen Tabellen gefunden.
Die Lösung soll am Ende alle verknüpften Datenbankpfade mir einmalig anzeigen (das bekomme ich aber selbst hin).
Was ich aber leider überhaupt nicht hinbekomme, ist das richtige Auslesen der Datenbankpfade
Spoiler anzeigen
Leider bekomme ich bei beiden Methoden immer in der Zeile Using reader As OleDbDataReader = command.ExecuteReader die Fehlermeldung "System.Data.OleDb.OleDbException: "Record(s) cannot be read; no read permission on 'MSysObjects'.""
Grundsätzlich ist mir der Fehler schon bewusst, da dies ja eine verdeckte Systemtabelle ist. Ich habe auch eine Möglichkeit gefunden, die vorschlägt, eine Abfrage auf diese Tabelle zu legen und diese Abfrage dann abzufragen. Eine insofern schöne Lösung, da man hier sofort auf die verknüpften Datenbankpfade gruppieren könnte und somit nicht im VB.Net Programm dies erledigen müsste. Nachteil: Ich müsste dann jedes Mal diese Abfrage erstellen. Also habe ich mal versucht, mit diesem Code das zu automatisieren
Spoiler anzeigen
Leider klappt das auch nicht (siehe Fehlermeldungen im Code). Das Erstellen habe ich auch mal kurz deaktiviert und den zweiten Teil zu testen, aber auch hier eine Fehlermeldung. Den dritten Teil, das Löschen der Abfrage, habe ich noch nicht probiert.
Jetzt mal eine Frage an Euch: Wie bekomme ich die/den Datenbankpfad einer Frontend bzw. Backend Datenbankanwendung ausgelesen?
Über kreative Lösungen würde ich mich sehr freuen.
Gruß
Volker
*Topic verschoben*
für ein kleines Datensicherungsprogramm suche ich eine Möglichkeit, eine Accessdatenbank bzw. deren Tabellen darauf hin zu untersuchen, ob es Tabellen gibt, die in einer anderen Datenbank stehen und in der Frontenddatenbank also nur verknüpft sind.
Mit diesen Pfaden würde ich dann auch diese mit sichern und somit alle benötigten Datenbanken sichern können. Wenn es möglich ist, dann wäre mir ACCDB und MDB Datenbanken sehr recht.
Ich habe hierzu schon einiges probiert, aber leider nie den Verknüpfungspfad der jeweiligen Tabellen gefunden.
Die Lösung soll am Ende alle verknüpften Datenbankpfade mir einmalig anzeigen (das bekomme ich aber selbst hin).
Was ich aber leider überhaupt nicht hinbekomme, ist das richtige Auslesen der Datenbankpfade
VB.NET-Quellcode
- Sub AccessDB_Verknuepfte_Tabellen(dbPath As String)
- ' Pfad zur Access-Datenbank
- ' Dim dbPath As String = "C:\Pfad\zu\deiner\Datenbank.accdb"
- ' Verbindung zur Access-Datenbank herstellen
- ' Verbindung zur Access-Datenbank herstellen
- Using connection As New OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};")
- connection.Open()
- ' SQL-Abfrage für die MSysObjects-Tabelle
- Dim query As String = "SELECT Database, Name, Type FROM MSysObjects WHERE Type=6" ' Type=1 steht für Tabellen
- Using command As New OleDbCommand(query, connection)
- Using reader As OleDbDataReader = command.ExecuteReader()
- ' Durchlaufen der Datensätze
- While reader.Read()
- Dim tableName As String = reader("Name").ToString()
- Dim tableType As Integer = Convert.ToInt32(reader("Type"))
- Console.WriteLine($"Tabelle: {tableName}, Typ: {tableType}")
- End While
- End Using
- End Using
- connection.Close()
- End Using
- Console.ReadLine()
- '' Verbindung zur Access-Datenbank herstellen
- 'Using connection As New OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};")
- ' connection.Open()
- ' ' Abfrage für die MSysObjects-Tabelle, um verknüpfte Tabellen zu finden
- ' Dim query As String = "SELECT Name, Connect FROM MSysObjects WHERE Type=6"
- ' Using command As New OleDbCommand(query, connection)
- ' Using reader As OleDbDataReader = command.ExecuteReader
- ' While reader.Read()
- ' Dim linkedTableName As String = reader("Name").ToString()
- ' Dim linkedDatabasePath As String = reader("Database").ToString()
- ' Console.WriteLine($"Verknüpfte Tabelle: {linkedTableName}")
- ' Console.WriteLine($" Verknüpft mit: {linkedDatabasePath}")
- ' End While
- ' End Using
- ' End Using
- ' connection.Close()
- 'End Using
- 'Console.ReadLine()
- End Sub
Leider bekomme ich bei beiden Methoden immer in der Zeile Using reader As OleDbDataReader = command.ExecuteReader die Fehlermeldung "System.Data.OleDb.OleDbException: "Record(s) cannot be read; no read permission on 'MSysObjects'.""
Grundsätzlich ist mir der Fehler schon bewusst, da dies ja eine verdeckte Systemtabelle ist. Ich habe auch eine Möglichkeit gefunden, die vorschlägt, eine Abfrage auf diese Tabelle zu legen und diese Abfrage dann abzufragen. Eine insofern schöne Lösung, da man hier sofort auf die verknüpften Datenbankpfade gruppieren könnte und somit nicht im VB.Net Programm dies erledigen müsste. Nachteil: Ich müsste dann jedes Mal diese Abfrage erstellen. Also habe ich mal versucht, mit diesem Code das zu automatisieren
VB.NET-Quellcode
- Sub AccessDB_Verknuepfte_Tabellen(dbPath As String)
- ' Pfad zur Access-Datenbank
- ' Dim dbPath As String = "C:\Pfad\zu\deiner\Datenbank.accdb"
- ' Verbindung zur Access-Datenbank herstellen
- ' Verbindung zur Access-Datenbank herstellen
- Using connection As New OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};")
- connection.Open()
- ' 1. Erstellen und Speichern einer Abfrage
- Dim createQuery As String = "CREATE VIEW GetTablePath AS SELECT MSysObjects.Database FROM MSysObjects WHERE (((MSysObjects.Type)=6)) GROUP BY MSysObjects.Database"
- Using command As New OleDbCommand(createQuery, connection)
- Try
- command.ExecuteNonQuery()
- Console.WriteLine("Abfrage erfolgreich erstellt.")
- Catch ex As Exception
- Console.WriteLine($"Fehler beim Erstellen der Abfrage: {ex.Message}")
- ' Fehler beim Erstellen der Abfrage: Record(s) cannot be read; no read permission on 'MSysObjects'.
- End Try
- End Using
- ' 2. Die Informationen holen
- ' SQL-Abfrage für die MSysObjects-Tabelle
- Dim query As String = "SELECT * FROM GetTablePath" ' Type=1 steht für Tabellen
- Using command As New OleDbCommand(query, connection)
- Using reader As OleDbDataReader = command.ExecuteReader() ' Fehler: Ein Ausnahmefehler des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
- ' Record(s) cannot be read; no read permission On 'MSysObjects'.
- ' Durchlaufen der Datensätze
- While reader.Read()
- Dim tableName As String = reader("Database").ToString()
- Console.WriteLine($"Tabelle: {tableName}")
- End While
- End Using
- End Using
- ' 3. Löschen der gespeicherten Abfrage
- Dim dropQuery As String = "DROP VIEW GetTablePath"
- Using command As New OleDbCommand(dropQuery, connection)
- Try
- command.ExecuteNonQuery()
- Console.WriteLine("Abfrage erfolgreich gelöscht.")
- Catch ex As Exception
- Console.WriteLine($"Fehler beim Löschen der Abfrage: {ex.Message}")
- End Try
- End Using
- connection.Close()
- End Using
- Console.ReadLine()
- end sub
Leider klappt das auch nicht (siehe Fehlermeldungen im Code). Das Erstellen habe ich auch mal kurz deaktiviert und den zweiten Teil zu testen, aber auch hier eine Fehlermeldung. Den dritten Teil, das Löschen der Abfrage, habe ich noch nicht probiert.
Jetzt mal eine Frage an Euch: Wie bekomme ich die/den Datenbankpfad einer Frontend bzw. Backend Datenbankanwendung ausgelesen?
Über kreative Lösungen würde ich mich sehr freuen.
Gruß
Volker
*Topic verschoben*
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()