Foutbericht 'De database is in een onverwachte status' wanneer u een database opent in Access

In dit artikel wordt een probleem opgelost dat optreedt wanneer u de DAO-bibliotheek gebruikt om een database te converteren.

Origineel KB-nummer: 888634

Opmerking

Dit artikel is van toepassing op een Microsoft Access-databasebestand (.mdb) of op een Microsoft Access-databasebestand (.accdb). Vereist basisvaardigheden op het gebied van macro's, coderen en interoperabiliteit.

Symptomen

Wanneer u een database probeert te openen in Microsoft Access 2000 of een latere versie, wordt het volgende foutbericht weergegeven:

De database heeft een onverwachte status

Oorzaak

Dit probleem kan optreden wanneer u de DAO-bibliotheek (Data Access Object) gebruikt om een database te converteren die u hebt gemaakt in Microsoft Access 97 of een eerdere versie met behulp van de methodeCompactDatabase. De methode CompactDatabase kan de nieuwe database gedeeltelijk geconverteerd laten.

Oplossing

U kunt dit probleem op een van de volgende manieren oplossen:

Methode 1: Gebruik de opdracht Database converteren wanneer u de oorspronkelijke database hebt

Als u nog steeds een kopie van de originele database in de originele indeling hebt, gebruikt u de opdrachtConvert Database. Ga hiervoor als volgt te werk:

Access 2000, Access 2002 of Access 2003

  1. Maak een back-up van de oorspronkelijke database.

  2. Start Access 2000 of een latere versie.

  3. Klik in het menu Extra op Databasehulpprogramma's, klik op Database converteren en klik vervolgens op Naar Access 2000-bestandsformaat.

    Opmerking

    Als u Access 2000 gebruikt, wordt alleen Naar huidige Access-databaseversie weergegeven in het menu Database converteren.

  4. Klik in het dialoogvenster Database om van te converteren op de naam van het databasebestand dat u wilt converteren en klik vervolgens op Converteren.

  5. Typ in het dialoogvenster Database converteren naar de nieuwe naam van het databasebestand en klik vervolgens op Opslaan.

Access 2007

  1. Maak een back-up van de oorspronkelijke database.
  2. Probeer die database te openen.
  3. Wanneer u een Access 97- of Access 95-bestandsindeling MDB-database opent, geeft Access het dialoogvenster Databaseverbetering weer. U wordt gevraagd de database te upgraden.
  4. Klik op Ja om de database te upgraden naar de bestandsindeling die u hebt geselecteerd als de standaardbestandsindeling in Access 2007. Nadat u de database hebt geconverteerd, kunt u ontwerpwijzigingen aanbrengen in het bestand in Access 2007. U kunt de database echter niet meer openen met een eerdere versie van Access dan de versie waarnaar u de database hebt geconverteerd.

Methode 2: Herstel de databasegegevens en de databasequery's wanneer u niet over de oorspronkelijke niet-beveiligde database beschikt

Als u geen kopie hebt van de oorspronkelijke niet-beveiligde database in de oorspronkelijke indeling en u hebt standaard technieken voor het oplossen van corruptieproblemen geprobeerd, probeer dan de databasegegevens en de databasequery's te herstellen. Ga hiervoor als volgt te werk:

  1. Maak een back-up van de oorspronkelijke database.

  2. Start Access 2000 of een latere versie.

  3. Access 2000, Access 2002 of Access 2003

    • Klik op Lege Access-database, typ de nieuwe databasenaam in het vak Bestandsnaam en klik vervolgens op Maken.

    Access 2007

    • Klik op de Office-knop, klik op Nieuw, klik op Lege database en klik vervolgens op Maken om een nieuwe lege database te maken.
  4. Access 2000, Access 2002 of Access 2003

    • Klik in het menu Invoegen op Module. De Microsoft Visual Basic Editor wordt gestart en er wordt een nieuwe module gemaakt.

    Access 2007

    • Klik op het tabblad Maken op de pijl-omlaag onder Macro en klik vervolgens op Module. De Microsoft Visual Basic Editor wordt gestart en er wordt een nieuwe module gemaakt.
  5. Klik in het menu Extra op Verwijzingen.

  6. Zoek in de lijst Beschikbare verwijzingen naar Microsoft DAO 3.6-objectbibliotheek en schakel vervolgens het selectievakje Microsoft DAO 3.6-objectbibliotheek in.

    Opmerking

    DAO 3.6 is ook beschikbaar op Windows XP Home Edition.

  7. Als u het dialoogvenster Verwijzingen wilt sluiten, klikt u op OK.

  8. Plak de volgende code in de nieuwe module die u hebt gemaakt.

    Sub RecoverCorruptDB()
     Dim dbCorrupt As DAO.Database
     Dim dbCurrent As DAO.Database
     Dim td As DAO.TableDef
     Dim tdNew As DAO.TableDef
     Dim fld As DAO.Field
     Dim fldNew As DAO.Field
     Dim ind As DAO.Index
     Dim indNew As DAO.Index
     Dim qd As DAO.QueryDef
     Dim qdNew As DAO.QueryDef
     Dim strDBPath As String
     Dim strQry As String
    
     ' Replace the following path with the path of the
     ' corrupted database.
     strDBPath = "C:\My Documents\yourDatabase.mdb"
    
     On Error Resume Next
     Set dbCurrent = CurrentDb
     Set dbCorrupt = OpenDatabase(strDBPath)
    
     For Each td In dbCorrupt.TableDefs
         If Left(td.Name, 4) <> "MSys" Then
             strQry = "SELECT * INTO [" & td.Name & "] FROM [" & td.Name & "] IN '" & dbCorrupt.Name & "'"
             dbCurrent.Execute strQry, dbFailOnError
             dbCurrent.TableDefs.Refresh
             Set tdNew = dbCurrent.TableDefs(td.Name)
    
     ' Re-create the indexes on the table.
             For Each ind In td.Indexes
                 Set indNew = tdNew.CreateIndex(ind.Name)
                 For Each fld In ind.Fields
                     Set fldNew = indNew.CreateField(fld.Name)
                     indNew.Fields.Append fldNew
                 Next
                 indNew.Primary = ind.Primary
                 indNew.Unique = ind.Unique
                 indNew.IgnoreNulls = ind.IgnoreNulls
                 tdNew.Indexes.Append indNew
                 tdNew.Indexes.Refresh
             Next
         End If
     Next
    
     ' Re-create the queries.
     For Each qd In dbCorrupt.QueryDefs
         If Left(qd.Name, 4) <> "~sq_" Then
             Set qdNew = dbCurrent.CreateQueryDef(qd.Name, qd.SQL)
         End If
     Next
    
     dbCorrupt.Close
     Application.RefreshDatabaseWindow
     MsgBox "Procedure Complete."
    End Sub
    

    Opmerking

    De code probeert alle tabellen en alle query's uit de beschadigde database te importeren in de huidige database. Vervang C:\My Documents\yourDatabase.mdb door het juiste pad en de bestandsnaam van uw database.

  9. Om de code uit te voeren, klikt u op Sub/UserForm uitvoeren in het menu Uitvoeren.

Methode 3: Herstel de databasegegevens wanneer u niet over de originele beveiligde database beschikt

Als u geen kopie hebt van de originele beveiligde database in de originele indeling en u hebt standaard technieken voor het oplossen van problemen met beschadigingen geprobeerd, probeer dan de databasegegevens te herstellen. Ga hiervoor als volgt te werk:

  1. Maak een back-up van de oorspronkelijke database.

  2. Start Access 2000 of een latere versie.

  3. Access 2000, Access 2002 of Access 2003

    • Klik op Lege Access-database, typ de nieuwe databasenaam in het vak Bestandsnaam en klik vervolgens op Maken.

    Access 2007

    • Klik op de Microsoft Office-knop, klik op Nieuw, klik op Lege database en klik vervolgens op Maken om een nieuwe lege database te maken.
  4. Access 2000, Access 2002 of Access 2003

    • Klik in het menu Invoegen op Module. De Microsoft Visual Basic Editor wordt gestart en er wordt een nieuwe module gemaakt.

    Access 2007

    • Klik op het tabblad Maken op de pijl-omlaag onder Macro en klik vervolgens op Module. De Microsoft Visual Basic Editor wordt gestart en er wordt een nieuwe module gemaakt.
  5. Klik in het menu Extra op Verwijzingen.

  6. Zoek in de lijst Beschikbare verwijzingen naar Microsoft DAO 3.6-objectbibliotheek en schakel vervolgens het selectievakje Microsoft DAO 3.6-objectbibliotheek in.

  7. Als u het dialoogvenster Verwijzingen wilt sluiten, klikt u op OK.

  8. Plak de volgende code in de nieuwe module die u hebt gemaakt.

    Option Compare Database
    
    Function BackupSecureDatabase()
    
     On Error GoTo Err_BackupSecureDatabase
     Dim wrkDefault As DAO.Workspace
     Dim dbsNew As DAO.Database
     Dim dbeSecure As DAO.PrivDBEngine
     Dim wrkSecure As DAO.Workspace
     Dim dbsSecure As DAO.Database
     Dim tdfSecure As DAO.TableDef
     Dim strSecureUser As String
     Dim strSecurePwd As String
     Dim strSecurePathToDatabase As String
     Dim strSecurePathToWorkgroupFile As String
     Dim strTableName As String
     Dim strSQL As String
     Dim dbsTemp As DAO.Database
     Dim strTempPathToDatabase As String
     Dim strBackupPathToDatabase As String
     Dim strLogPath As String
     Dim SourceRec As DAO.Recordset
     Dim DestRec As DAO.Recordset
    
     ' Set the variables (change for environment).
     strSecurePathToDatabase = "C:\MyDatabases\Northwind.mdb"
     strSecurePathToWorkgroupFile = "C:\MyDatabases\Secured.mdw"
     strSecureUser = "Administrator"
     strSecurePwd = "password"
     strTempPathToDatabase = "C:\MyDatabases\Temp.mdb"
     strBackupPathToDatabase = "C:\MyDatabases\Backup.mdb"
     strLogPath = "C:\MyDatabases\Backup.log"
    
     ' Open the log file.
     Open strLogPath For Output As #1
     Print #1, Time, "Log file opened"
     Print #1, Time, "Variables set"
    
     ' Delete old files.
     If Dir(strTempPathToDatabase) <> "" Then Kill strTempPathToDatabase
     If Dir(strBackupPathToDatabase) <> "" Then Kill strBackupPathToDatabase
     Print #1, Time, "Old backup files deleted"
    
     ' Create the new temp database.
     Set wrkDefault = DBEngine.Workspaces(0)
     Set dbsNew = wrkDefault.CreateDatabase(strTempPathToDatabase, dbLangGeneral)
     Set dbsNew = Nothing
     Print #1, Time, "Temp database created"
    
     ' Open the secured database.
     Set dbeSecure = New PrivDBEngine
     dbeSecure.SystemDB = strSecurePathToWorkgroupFile
     dbeSecure.DefaultUser = strSecureUser
     dbeSecure.DefaultPassword = strSecurePwd
    
     Set wrkSecure = dbeSecure.Workspaces(0)
     Set dbsSecure = wrkSecure.OpenDatabase(strSecurePathToDatabase)
     Print #1, Time, "Secured database opened from " & strSecurePathToDatabase
    
     ' Open the temp database.
     DBEngine(0).CreateUser
     Set dbsTemp = DBEngine(0).OpenDatabase(strTempPathToDatabase)
    
     Print #1, Time, "Temp database opened from " & strTempPathToDatabase
    
     ' Loop through the tables in the secured database.
     For Each tdfSecure In dbsSecure.TableDefs
        strTableName = tdfSecure.Name
        If Left(strTableName, 4) <> "MSys" Then
            Print #1, Time, "Export of " & strTableName
            ' Copy the table definition to the temp database.
            If CopyTableDef(tdfSecure, dbsTemp, strTableName) Then
                ' Then append all the data into the table.
                 Set SourceRec = tdfSecure.OpenRecordset(dbOpenTable, dbReadOnly)
                 Set DestRec = dbsTemp.OpenRecordset(strTableName)
                 AppendRecordsFromOneRecordSetToAnother SourceRec, DestRec 
                 SourceRec.Close
                 DestRec.Close
    
            End If
        End If
     Next tdfSecure
    
     ' Close open objects.
     dbsSecure.Close
     Print #1, Time, "Secured database closed"
     dbsTemp.Close
     Print #1, Time, "Temp database closed"
    
     ' Compact the database into the backup database.
     DBEngine.CompactDatabase strTempPathToDatabase, strBackupPathToDatabase, dbLangGeneral
     Print #1, Time, "New backup database created at " & strBackupPathToDatabase
    
     ' Delete the temp database.
     If Dir(strTempPathToDatabase) <> "" Then Kill strTempPathToDatabase
     Print #1, Time, "Temp database deleted"
     Print #1, Time, "Log file closed"
     Close #1
    
    Exit_BackupSecureDatabase:
    
     Set wrkDefault = Nothing
     Set dbsNew = Nothing
     Set dbeSecure = Nothing
     Set wrkSecure = Nothing
     Set dbsSecure = Nothing
     Set tdfSecure = Nothing
     Set dbsTemp = Nothing
     Exit Function
    
    Err_BackupSecureDatabase:
       Print #1, Time, "     ***ERROR: " & Err.Number, Err.Description, strTableName
       Resume Next
    
    End Function
    
    Function CopyTableDef(SourceTableDef As TableDef, TargetDB As Database, TargetName As String) As Integer
    Dim SI As DAO.Index, SF As DAO.Field, SP As DAO.Property
    Dim T As DAO.TableDef, I As DAO.Index, F As DAO.Field, P As DAO.Property
    Dim I1 As Integer, f1 As Integer, P1 As Integer
    
     If SourceTableDef.Attributes And dbAttachedODBC Or SourceTableDef.Attributes And dbAttachedTable Then
      CopyTableDef = False
      Exit Function
     End If
     Set T = TargetDB.CreateTableDef(TargetName)
    
     ' Copy Jet Properties.
      On Error Resume Next
      For P1 = 0 To T.Properties.Count - 1
       If T.Properties(P1).Name <> "Name" Then
         T.Properties(P1).Value = SourceTableDef.Properties(P1).Value
       End If
      Next P1
     On Error GoTo 0
    
     ' Copy Fields.
       For f1 = 0 To SourceTableDef.Fields.Count - 1
        Set SF = SourceTableDef.Fields(f1)
    
        ' DAO 3.0 and later versions. ****
        If (SF.Attributes And dbSystemField) = 0 Then
         Set F = T.CreateField()
         ' Copy Jet Properties.
           On Error Resume Next
           For P1 = 0 To F.Properties.Count - 1
             F.Properties(P1).Value = SF.Properties(P1).Value
           Next P1
           On Error GoTo 0
         T.Fields.Append F
        End If ' Corresponding End If ****
     Next f1
    
    ' Copy Indexes.
     For I1 = 0 To SourceTableDef.Indexes.Count - 1
       Set SI = SourceTableDef.Indexes(I1)
    
    ' Foreign indexes are added by relationships.
       If Not SI.Foreign Then
         Set I = T.CreateIndex()
         ' Copy Jet Properties.
           On Error Resume Next
           For P1 = 0 To I.Properties.Count - 1
             I.Properties(P1).Value = SI.Properties(P1).Value
           Next P1
           On Error GoTo 0
         ' Copy Fields.
           For f1 = 0 To SI.Fields.Count - 1
             Set F = T.CreateField(SI.Fields(f1).Name, T.Fields(SI.Fields(f1).Name).Type)
             I.Fields.Append F
           Next f1
         T.Indexes.Append I
       End If
     Next I1
    
    ' Append TableDef.
     TargetDB.TableDefs.Append T
    
    ' Copy Access/User Table Properties.
     For P1 = T.Properties.Count To SourceTableDef.Properties.Count - 1
       Set SP = SourceTableDef.Properties(P1)
       Set P = T.CreateProperty(SP.Name, SP.Type)
       P.Value = SP.Value
       T.Properties.Append P
     Next P1
    
    ' Copy Access/User Field Properties.
     For f1 = 0 To T.Fields.Count - 1
       Set SF = SourceTableDef.Fields(f1)
       Set F = T.Fields(f1)
       For P1 = F.Properties.Count To SF.Properties.Count - 1
         Set SP = SF.Properties(P1)
         Set P = F.CreateProperty(SP.Name, SP.Type)
         P.Value = SP.Value
         F.Properties.Append P
       Next P1
     Next f1
    
    ' Copy Access/User Index Properties.
     For I1 = 0 To T.Indexes.Count - 1
       Set SI = SourceTableDef.Indexes(T.Indexes(I1).Name)
    
    ' Do not copy foreign indexes. They are created by relationships.
       If Not SI.Foreign Then
         Set I = T.Indexes(I1)
         For P1 = I.Properties.Count To SI.Properties.Count - 1
           Set SP = SI.Properties(P1)
           Set P = I.CreateProperty(SP.Name, SP.Type)
           P.Value = SP.Value
           I.Properties.Append P
         Next P1
       End If
      Next I1
     CopyTableDef = True
    End Function
    
    Function AppendRecordsFromOneRecordSetToAnother(SR As DAO.Recordset, DR As DAO.Recordset)
    Dim x As Integer
    
    Do While Not SR.EOF
    DR.AddNew
     For x = 0 To SR.Fields.Count - 1
         DR(x).Value = SR(x).Value
     Next x
    DR.Update
    SR.MoveNext
    Loop
    End Function
    

    Opmerking

    De code zal proberen alle tabellen uit de beschadigde database te importeren in een back-updatabase. Vervang de variabelen in de tabel na stap 10 door uw databasebestandslocaties en uw gebruikersinstellingen.

  9. Selecteer in de lijst met functies BackupSecureDatabase.

  10. Om de code uit te voeren, klikt u op Sub/UserForm uitvoeren in het menu Uitvoeren.

    Variabele Omschrijving
    strSecurePathToDatabase Locatie van beveiligd databasebestand
    strSecurePathToWorkgroupFile Locatie van werkgroepbestand
    strSecureUser Beveiligde naam voor aanmelding van gebruiker
    strSecurePwd Wachtwoord voor beveiligde aanmelding van gebruiker
    strTempPathToDatabase Locatie van tijdelijk databasebestand
    strBackupPathToDatabase Locatie van back-updatabasebestand
    strLogPath Locatie van het logboekbestand

Status

Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die worden vermeld in de sectie Van toepassing op.

Meer informatie

Raadpleeg het volgende artikel voor meer informatie over het oplossen van beschadigingen in een Microsoft Access-database:

Een database comprimeren en repareren