FAQ fĂŒr Entwickler, die’s richtig machen wollen
Warum ĂŒberhaupt von MDB nach ACCDB konvertieren?
Die Frage kommt öfter, als du denkst.
MDB ist das alte Access-Format. Bis Access 2003.
ACCDB kam mit Access 2007. Ist seit 18 Jahren Standard.
Warum du konvertieren solltest:
- MDB ist auf 2 GB limitiert. ACCDB schafft theoretisch bis 32 GB (praktisch: bis 2 GB sinnvoll)
- ACCDB unterstĂŒtzt AnhĂ€nge, mehrzeilige Textfelder, berechnete Spalten
- ACCDB hat bessere VerschlĂŒsselung (AES statt RC4)
- ACCDB unterstĂŒtzt SharePoint-Integration
- Neuere Access-Versionen nerven mit MDB-Dateien (KompatibilitÀtsmodus)
Warum du vielleicht nicht konvertieren solltest:
- Du hast Legacy-Anwendungen, die nur MDB verstehen
- Du nutzt Access 2003 oder Àlter (dann kannst du ACCDB nicht öffnen)
- Du hast replizierte Datenbanken (Replikation gibt’s in ACCDB nicht mehr)
Gibt es wirklich Online-Tools zum Konvertieren?
Kurze Antwort: Nein. Nicht seriös.
Lange Antwort: Es gibt ein paar dubiose Websites, die behaupten, sie wĂŒrden MDB nach ACCDB konvertieren.
Warum das Quatsch ist:
- Du lÀdst deine GeschÀftsdaten auf fremde Server hoch (Datenschutz? Fehlanzeige)
- Die meisten „Konverter“ sind nur Wrapper um Access selbst (brauchen also Access-Installation)
- Viele sind Malware-Schleudern oder wollen nur deine E-Mail-Adresse
Was wirklich funktioniert:
Access selbst. VBA-Script. PowerShell mit Access-COM-Objekt.
Alles andere ist Unfug.
Wie konvertiere ich mit Access selbst?
Der einfachste Weg.
Methode 1: Manuell in Access
- Access öffnen
- MDB-Datei öffnen
- „Datei“ â „Speichern unter“ â „Datenbank speichern unter“
- „Access-Datenbank (*.accdb)“ auswĂ€hlen
- Speicherort wÀhlen
- Fertig
Achtung: Nicht alle Features werden automatisch konvertiert.
Was manuell nachgearbeitet werden muss:
- Benutzer-Level-Security (gibt’s in ACCDB nicht mehr)
- Replikation (gibt’s in ACCDB nicht mehr)
- DAO 3.6 Code (muss auf DAO 12.0 umgestellt werden)
Methode 2: VBA-Script fĂŒr Batch-Konvertierung
Wenn du viele MDB-Dateien hast.
' Modul: MDB_to_ACCDB_Converter
Option Compare Database
Option Explicit
Public Sub ConvertMDBtoACCDB(strSourcePath As String, strTargetPath As String)
On Error GoTo ErrorHandler
Dim acc As Object
Dim strMDBFile As String
Dim strACCDBFile As String
' Access-Anwendung erstellen
Set acc = CreateObject("Access.Application")
strMDBFile = strSourcePath
strACCDBFile = strTargetPath
' PrĂŒfen, ob Quelle existiert
If Dir(strMDBFile) = "" Then
MsgBox "MDB-Datei nicht gefunden: " & strMDBFile, vbCritical
Exit Sub
End If
' MDB öffnen
acc.OpenCurrentDatabase strMDBFile
' Als ACCDB speichern
acc.Application.ConvertAccessProject strMDBFile, strACCDBFile, acFileFormatAccess2007
' SchlieĂen
acc.CloseCurrentDatabase
acc.Quit
Set acc = Nothing
MsgBox "Konvertierung erfolgreich: " & vbCrLf & strACCDBFile, vbInformation
Exit Sub
ErrorHandler:
MsgBox "Fehler bei Konvertierung: " & Err.Description, vbCritical
If Not acc Is Nothing Then
acc.Quit
Set acc = Nothing
End If
End Sub
' Batch-Konvertierung fĂŒr ganzen Ordner
Public Sub ConvertAllMDBInFolder(strFolderPath As String)
On Error GoTo ErrorHandler
Dim strFile As String
Dim strSourceFile As String
Dim strTargetFile As String
Dim intCount As Integer
' PrĂŒfen, ob Pfad mit \ endet
If Right(strFolderPath, 1) <> "\" Then
strFolderPath = strFolderPath & "\"
End If
' Ersten MDB-Datei finden
strFile = Dir(strFolderPath & "*.mdb")
intCount = 0
Do While strFile <> ""
strSourceFile = strFolderPath & strFile
strTargetFile = strFolderPath & Replace(strFile, ".mdb", ".accdb")
' Konvertieren
Call ConvertMDBtoACCDB(strSourceFile, strTargetFile)
intCount = intCount + 1
' NĂ€chste Datei
strFile = Dir()
Loop
MsgBox "Konvertierung abgeschlossen. " & intCount & " Dateien konvertiert.", vbInformation
Exit Sub
ErrorHandler:
MsgBox "Fehler: " & Err.Description, vbCritical
End Sub
Aufruf:
' Einzelne Datei
ConvertMDBtoACCDB "C:\Daten\alt.mdb", "C:\Daten\neu.accdb"
' Ganzer Ordner
ConvertAllMDBInFolder "C:\Daten\MDB-Dateien\"
Wie konvertiere ich per PowerShell?
Wenn du’s scriptbar brauchst. Ohne Access-GUI.
# MDB zu ACCDB Konverter
# Benötigt: Access installiert
function Convert-MDBtoACCDB {
param(
[Parameter(Mandatory=$true)]
[string]$SourcePath,
[Parameter(Mandatory=$true)]
[string]$TargetPath
)
# PrĂŒfen, ob Quelle existiert
if (-not (Test-Path $SourcePath)) {
Write-Error "MDB-Datei nicht gefunden: $SourcePath"
return
}
# Access-COM-Objekt erstellen
$access = New-Object -ComObject Access.Application
try {
# MDB öffnen
$access.OpenCurrentDatabase($SourcePath)
# Als ACCDB speichern
# acFileFormatAccess2007 = 12
$access.Application.SaveAsAcrossMDBFormats($SourcePath, $TargetPath, 12)
Write-Host "Konvertierung erfolgreich: $TargetPath" -ForegroundColor Green
}
catch {
Write-Error "Fehler bei Konvertierung: $_"
}
finally {
# Access schlieĂen
$access.CloseCurrentDatabase()
$access.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($access) | Out-Null
Remove-Variable access
}
}
# Batch-Konvertierung
function Convert-AllMDBInFolder {
param(
[Parameter(Mandatory=$true)]
[string]$FolderPath
)
# Alle MDB-Dateien finden
$mdbFiles = Get-ChildItem -Path $FolderPath -Filter "*.mdb"
$count = 0
foreach ($file in $mdbFiles) {
$sourcePath = $file.FullName
$targetPath = [System.IO.Path]::ChangeExtension($sourcePath, ".accdb")
Write-Host "Konvertiere: $($file.Name)" -ForegroundColor Yellow
Convert-MDBtoACCDB -SourcePath $sourcePath -TargetPath $targetPath
$count++
}
Write-Host "`nKonvertierung abgeschlossen: $count Dateien" -ForegroundColor Cyan
}
# Verwendung:
# Convert-MDBtoACCDB -SourcePath "C:\Daten\alt.mdb" -TargetPath "C:\Daten\neu.accdb"
# Convert-AllMDBInFolder -FolderPath "C:\Daten\MDB-Dateien"
AusfĂŒhren:
# Einzelne Datei
.\Convert-MDB.ps1
Convert-MDBtoACCDB -SourcePath "C:\alt.mdb" -TargetPath "C:\neu.accdb"
# Ganzer Ordner
Convert-AllMDBInFolder -FolderPath "C:\MDB-Dateien"
Was passiert bei der Konvertierung wirklich?
Access macht nicht einfach „Save As“.
Der Prozess:
- Neue ACCDB-Datei wird angelegt
- Tabellen-Schemas werden kopiert (mit neuen Datentypen)
- Daten werden Tabelle fĂŒr Tabelle kopiert
- Queries werden konvertiert (SQL wird angepasst)
- Formulare werden kopiert
- Berichte werden kopiert
- VBA-Module werden kopiert
- Makros werden konvertiert
Was sich Àndert:
| MDB | ACCDB | Bemerkung |
|---|---|---|
| Jet 4.0 Engine | ACE Engine | Neue Datenbank-Engine |
| DAO 3.6 | DAO 12.0 | Neue Library-Version |
| User-Level Security | Keine | Muss auf Datei-Ebene gelöst werden |
| Replikation | Keine | Alternative: SharePoint Sync |
| 2 GB Limit | 2 GB empfohlen | Theoretisch 32 GB möglich |
Wie migriere ich VBA-Code korrekt?
VBA-Code wird kopiert. Aber nicht immer sauber.
Problem 1: DAO-Referenzen
MDB nutzt DAO 3.6. ACCDB nutzt DAO 12.0.
Vor der Konvertierung in MDB:
Extras â Verweise â „Microsoft DAO 3.6 Object Library“ ist aktiviert
Nach der Konvertierung in ACCDB:
Extras â Verweise â PrĂŒfen
Wenn „MISSING: Microsoft DAO 3.6“ steht:
- Haken entfernen bei DAO 3.6
- Haken setzen bei „Microsoft Office 16.0 Access database engine Object Library“
VBA-Code anpassen:
' ALT (MDB):
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("Tabelle1", dbOpenDynaset)
' NEU (ACCDB) - eigentlich identisch, aber Library muss aktualisiert sein
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("Tabelle1", dbOpenDynaset)
Syntax bleibt gleich. Nur die Referenz muss stimmen.
Problem 2: User-Level Security Code
MDB hatte User-Level Security. ACCDB nicht mehr.
Code wie dieser funktioniert nicht mehr:
' FUNKTIONIERT NICHT in ACCDB
Dim ws As DAO.Workspace
Set ws = DBEngine.Workspaces(0)
MsgBox "Aktueller Benutzer: " & ws.UserName
Alternative in ACCDB:
' Windows-Benutzer abfragen
MsgBox "Aktueller Benutzer: " & Environ("USERNAME")
' Oder: Access-Umgebung
MsgBox "Access-Benutzer: " & CurrentUser()
Problem 3: Jet-SQL vs. ACE-SQL
Manche SQL-Syntax hat sich geÀndert.
Beispiel: TOP mit Prozent
-- MDB (Jet):
SELECT TOP 10 PERCENT * FROM Kunden ORDER BY Umsatz DESC;
-- ACCDB (ACE): identisch, funktioniert weiterhin
SELECT TOP 10 PERCENT * FROM Kunden ORDER BY Umsatz DESC;
Die meisten SQL-Queries funktionieren 1:1. Aber nicht alle.
Problematisch:
-- Alte Jet-Syntax fĂŒr DISTINCTROW
SELECT DISTINCTROW Kunden.Name FROM Kunden;
-- ACE-Syntax
SELECT DISTINCT Kunden.Name FROM Kunden;
Wie konvertiere ich Frontend/Backend-Systeme?
Typisches Setup: Frontend.mdb â Backend.mdb
Beide mĂŒssen konvertiert werden.
Schritt 1: Backend konvertieren
ConvertMDBtoACCDB "\\Server\Daten\Backend.mdb", "\\Server\Daten\Backend.accdb"
Schritt 2: Frontend konvertieren
ConvertMDBtoACCDB "C:\Frontend\App.mdb", "C:\Frontend\App.accdb"
Schritt 3: Linked Tables neu verknĂŒpfen
Nach der Konvertierung zeigen die verknĂŒpften Tabellen noch auf Backend.mdb.
VBA zum NeuverknĂŒpfen:
Public Sub RelinkTablesToNewBackend(strNewBackendPath As String)
On Error GoTo ErrorHandler
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strOldConnect As String
Dim strNewConnect As String
Set db = CurrentDb()
' Durch alle Tabellen iterieren
For Each tdf In db.TableDefs
' Nur verknĂŒpfte Tabellen
If Len(tdf.Connect) > 0 And Left(tdf.Name, 4) <> "MSys" Then
strOldConnect = tdf.Connect
' Neuen Connection String bauen
strNewConnect = ";DATABASE=" & strNewBackendPath
' Verbindung aktualisieren
tdf.Connect = strNewConnect
tdf.RefreshLink
Debug.Print "VerknĂŒpft: " & tdf.Name & " â " & strNewBackendPath
End If
Next tdf
Set tdf = Nothing
Set db = Nothing
MsgBox "Alle Tabellen neu verknĂŒpft mit: " & strNewBackendPath, vbInformation
Exit Sub
ErrorHandler:
MsgBox "Fehler beim NeuverknĂŒpfen: " & Err.Description, vbCritical
End Sub
' Aufruf
RelinkTablesToNewBackend "\\Server\Daten\Backend.accdb"
Wie prĂŒfe ich, ob die Konvertierung erfolgreich war?
Nicht einfach konvertieren und hoffen.
Checkliste:
1. Tabellenanzahl prĂŒfen
Public Sub VerifyTableCount(strMDB As String, strACCDB As String)
Dim dbMDB As DAO.Database
Dim dbACCDB As DAO.Database
Dim intCountMDB As Integer
Dim intCountACCDB As Integer
Set dbMDB = OpenDatabase(strMDB)
Set dbACCDB = OpenDatabase(strACCDB)
' Tabellen zÀhlen (ohne System-Tabellen)
For Each tdf In dbMDB.TableDefs
If Left(tdf.Name, 4) <> "MSys" Then
intCountMDB = intCountMDB + 1
End If
Next
For Each tdf In dbACCDB.TableDefs
If Left(tdf.Name, 4) <> "MSys" Then
intCountACCDB = intCountACCDB + 1
End If
Next
Debug.Print "MDB: " & intCountMDB & " Tabellen"
Debug.Print "ACCDB: " & intCountACCDB & " Tabellen"
If intCountMDB = intCountACCDB Then
Debug.Print "â Tabellenanzahl identisch"
Else
Debug.Print "â Tabellenanzahl unterschiedlich!"
End If
dbMDB.Close
dbACCDB.Close
End Sub
2. Datensatz-Anzahl prĂŒfen
Public Sub VerifyRecordCounts(strMDB As String, strACCDB As String, strTableName As String)
Dim dbMDB As DAO.Database
Dim dbACCDB As DAO.Database
Dim rsMDB As DAO.Recordset
Dim rsACCDB As DAO.Recordset
Set dbMDB = OpenDatabase(strMDB)
Set dbACCDB = OpenDatabase(strACCDB)
Set rsMDB = dbMDB.OpenRecordset("SELECT COUNT(*) AS Anzahl FROM [" & strTableName & "]")
Set rsACCDB = dbACCDB.OpenRecordset("SELECT COUNT(*) AS Anzahl FROM [" & strTableName & "]")
Debug.Print "Tabelle: " & strTableName
Debug.Print "MDB: " & rsMDB!Anzahl & " DatensÀtze"
Debug.Print "ACCDB: " & rsACCDB!Anzahl & " DatensÀtze"
If rsMDB!Anzahl = rsACCDB!Anzahl Then
Debug.Print "â Datensatzanzahl identisch"
Else
Debug.Print "â Datensatzanzahl unterschiedlich!"
End If
rsMDB.Close
rsACCDB.Close
dbMDB.Close
dbACCDB.Close
End Sub
3. VBA-Module prĂŒfen
Manuell durchgehen. Kompilieren.
Extras â Kompilieren (Projektname)
Wenn Fehler: Referenzen prĂŒfen.
4. Formulare/Berichte testen
Alle durchklicken. PrĂŒfen, ob sie öffnen.
Wie konvertiere ich verschlĂŒsselte MDB-Dateien?
MDB konnte mit Passwort verschlĂŒsselt werden.
Problem: Konvertierung funktioniert nur mit entschlĂŒsselter Datei.
Schritt 1: MDB entschlĂŒsseln
Public Sub DecryptMDB(strMDBPath As String, strPassword As String, strOutputPath As String)
On Error GoTo ErrorHandler
Dim dbEncrypted As DAO.Database
Dim dbDecrypted As DAO.Database
' VerschlĂŒsselte DB öffnen
Set dbEncrypted = OpenDatabase(strMDBPath, False, False, ";PWD=" & strPassword)
' Neue unverschlĂŒsselte DB erstellen
Set dbDecrypted = CreateDatabase(strOutputPath, dbLangGeneral)
' Tabellen kopieren
' (vereinfacht, in Produktion: alle Objekte kopieren)
dbEncrypted.Close
dbDecrypted.Close
MsgBox "MDB entschlĂŒsselt: " & strOutputPath, vbInformation
Exit Sub
ErrorHandler:
MsgBox "Fehler: " & Err.Description, vbCritical
End Sub
Schritt 2: EntschlĂŒsselte MDB nach ACCDB konvertieren
ConvertMDBtoACCDB "C:\temp\decrypted.mdb", "C:\neu.accdb"
Schritt 3: ACCDB wieder verschlĂŒsseln
ACCDB hat andere VerschlĂŒsselung.
Public Sub EncryptACCDB(strACCDBPath As String, strPassword As String)
Dim db As DAO.Database
Set db = OpenDatabase(strACCDBPath, True) ' Exclusive
' Passwort setzen (alte Methode, funktioniert noch)
db.NewPassword strPassword, ""
db.Close
Set db = Nothing
MsgBox "ACCDB verschlĂŒsselt", vbInformation
End Sub
Moderne Methode (AES-VerschlĂŒsselung):
Extras â Datenbank verschlĂŒsseln (in Access GUI)
Oder per VBA:
' Benötigt Access 2007+
DBEngine.CompactDatabase strACCDBPath, strTempPath, , dbEncrypt, ";pwd=" & strPassword
Kill strACCDBPath
Name strTempPath As strACCDBPath
Mein Fazit aus 20 Jahren Access-Entwicklung
MDB nach ACCDB konvertieren ist nicht schwer.
Aber:
Mach’s nicht online. Mach’s lokal. Mit Access. Mit VBA. Mit PowerShell.
Wichtigste Lektion: Nach der Konvertierung testen. Alles.
Typische Fehler:
- Referenzen nicht geprĂŒft
- Linked Tables nicht neu verknĂŒpft
- User-Security-Code nicht entfernt
- Keine Backups gemacht
Fragen? Schreib mir.
Ich bin der DatenschÀfer. Und ich konvertiere Access-Datenbanken seit 2005.