Access 2010-Datenbank reorganisieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Access 2010-Datenbank reorganisieren

    Hallo zusammen,

    ich möchte eine Access 2010-Datenbank reorganisieren mit folgendem Code:

    VB.NET-Quellcode

    1. Dim JE As New JRO.JetEngine()
    2. Try
    3. If File.Exists("C:\TEST\MEINEDB_NEU.accdb") Then
    4. File.Delete("C:\TEST\MEINEDB_NEU.accdb")
    5. End If
    6. JE.CompactDatabase("Data Source=C:\TEST\MEINEDB.accdb", "Data Source=C:\TEST\MEINEDB_NEU.accdb")
    7. If File.Exists("C:\TEST\MEINEDB_NEU.accdb") Then
    8. File.Delete("C:\TEST\MEINEDB.accdb")
    9. File.Copy("C:\TEST\MEINEDB_NEU.accdb", "C:\TEST\MEINEDB.accdb")
    10. File.Delete("C:\TEST\MEINEDB_NEU.accdb")
    11. End If
    12. Catch ex As Exception
    13. strMELD = "Fehler beim Reorganisieren: " & ex.Message & vbNewLine & "Reason: " & Strings.Right(ex.StackTrace, 50) & vbNewLine & "Source: " & ex.Source
    14. MessageBox.Show(strMELD)
    15. End Try


    Beim Befehl

    VB.NET-Quellcode

    1. JE.CompactDatabase("Data Source=C:\TEST\MEINEDB.accdb", "Data Source=C:\TEST\MEINEDB_NEU.accdb")


    erfolgt die Fehlermeldung "Nicht erkennbares Datenbankformat". Die Datenbank ist vorhanden, Access 2010 ist auch auf dem Rechner installiert. Die Datenbank lässt sich mit Access auch öffnen. Das Reorganisieren soll später beim Kunden erfolgen, falls dessen DB defekt ist.

    Ich habe einen Verweis auf "Microsoft Jet and Replication Object 2.6" erstellt.

    Was mache ich falsch?

    Danke im voraus,

    Schorsch

    SchorschCode schrieb:

    mit Access 2010
    32- oder 64-Bit-Version von Office?

    SchorschCode schrieb:

    Der Zugriff auf die DB ist ja korrekt (lesen, schreiben, löschen)
    Läuft das auch über Jet?
    Welche Art von Connectionstring verwendest du für den Normalzugriff?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich verwende Access 2010 in der 32 Bit-Version.
    Der Connectionstring lautet:

    VB.NET-Quellcode

    1. Provider=Microsoft.ACE.OLEDB.12.0;Data Source="C:\TEST\MEINEDB.accdb;


    Ist also wohl nicht JET. Danke für den Hinweis!

    Die Frage lautet nun, wie ich unter diesen Bedingungen die DB reorganisieren kann. 3 verschiedene Bücher und Google geben keine klare Auskunft.

    Bin dankbar für jeden Tipp!
    Habe nach stundenlangem Suchen und Lesen die Lösung gefunden.

    Ich habe folgenden Verweis hinzugefügt:

    VB.NET-Quellcode

    1. Microsoft Office 14.0 Access database engine Object Library


    Die Routine sind dann so aus:

    VB.NET-Quellcode

    1. Private Sub subREORG()
    2. Dim dbe As New Microsoft.Office.Interop.Access.Dao.DBEngine
    3. Dim strMELD As String
    4. Try
    5. If File.Exists("C:\TEST\MEINEDB_NEW.accdb") Then
    6. File.Delete("C:\TEST\MEINEDB_NEW.accdb")
    7. End If
    8. ' mit Passwort:
    9. ' dbe.CompactDatabase("C:\TEST\MEINEDB.accdb", "C:\TEST\MEINEDB_NEW.accdb", , , ";pwd=<database password>")
    10. dbe.CompactDatabase("C:\TEST\MEINEDB.accdb", "C:\TEST\MEINEDB_NEW.accdb")
    11. If File.Exists("C:\TEST\MEINEDB_NEW.accdb") Then
    12. File.Delete("C:\TEST\MEINEDB.accdb")
    13. File.Copy("C:\TEST\MEINEDB_NEW.accdb", "C:\TEST\MEINEDB.accdb")
    14. File.Delete("C:\TEST\MEINEDB_NEW.accdb")
    15. End If
    16. strMELD = "Die Reorganisation ist beendet."
    17. MessageBox.Show(strMELD)
    18. Catch ex As Exception
    19. strMELD = "Fehler beim Reorganisieren: " & ex.Message & vbNewLine & "Grund: " & Strings.Right(ex.StackTrace, 50) & vbNewLine & "Quelle: " & ex.Source
    20. MessageBox.Show(strMELD)
    21. End Try
    22. End Sub
    Vereinfachung, und sicherer:

    VB.NET-Quellcode

    1. Private Sub subREORG()
    2. Dim dbe As New Microsoft.Office.Interop.Access.Dao.DBEngine
    3. Dim fiOld = New FileInfo("C:\TEST\MEINEDB.accdb")
    4. Dim fi = New FileInfo("C:\TEST\MEINEDB_NEW.accdb")
    5. ' mit Passwort:
    6. ' dbe.CompactDatabase(fiOld.FullName, fi.FullName, , , ";pwd=<database password>")
    7. dbe.CompactDatabase(fiOld.FullName, fi.FullName)
    8. fiOld.Delete()
    9. fi.MoveTo(fiOld.FullName)
    10. End Sub
    Es bringt nichts, Fehlern durch If-Abfragen oder TryCatch auszuweichen.
    Sicherheit erfordert, dass Fehler auftreten müssen, wenn etwas nicht stimmt.
    Solange alles i.O. ist, dürften in meiner Variante keine Fehler auftreten.