Access'te bir veritabanı açtığınızda, "Veritabanı beklenmeyen bir durumda" hatası

Bu makale, veritabanını dönüştürmek için DAO kitaplığını kullandığınızda oluşan bir sorunu düzeltir.

Orijinal KB numarası: 888634

Not

Bu makale, Microsoft Access veritabanı (.mdb) dosyası veya Microsoft Access veritabanı (.accdb) dosyası için geçerlidir. Temel makro, kodlama ve birlikte çalışabilirlik becerileri gerektirir.

Belirtiler

Microsoft Access 2000 ya da sonraki versiyonlarda bir veritabanı açmaya çalıştığınızda, aşağıdaki hata iletisini alırsınız:

Veritabanı beklenmeyen bir durumda

Neden

Bu sorun, Microsoft Access 97'de veya daha önceki bir sürümde oluşturduğunuz bir veritabanını CompactDatabase yöntemini kullanarak dönüştürmek için Veri Erişim Nesnesi (DAO) kitaplığını kullandığınızda oluşabilir. CompactDatabase yöntemi, yeni veritabanını kısmen dönüştürülmüş durumda bırakabilir.

Çözüm

Bu sorunu gidermek için aşağıdaki yöntemlerden birini kullanın:

Yöntem 1: Özgün veritabanınız olduğunda Veritabanını Dönüştür komutunu kullanma

Özgün veritabanının özgün biçimindeki bir kopyası hala varsa Convert Database komutunu kullanın. Bunu yapmak için şu adımları uygulayın:

Access 2000, Access 2002 veya Access 2003

  1. Özgün veritabanının yedek kopyasını oluşturun.

  2. Access 2000 veya sonraki bir sürümü başlatın.

  3. Araçlar menüsünden Veritabanı Yardımcıları'na tıklayın, Veritabanını Dönüştür'e ve sonra da Access 2000 Dosya Biçimine'ye tıklayın.

    Not

    Access 2000 kullanıyorsanız, Veritabanını Dönüştür menüsünde yalnızca Geçerli Access Veritabanı Sürümüne görünür.

  4. Şuradan Dönüştürülecek Veritabanı iletişim kutusunda, dönüştürmek istediğiniz veritabanına tıklayın ve ardından Dönüştür'e tıklayın.

  5. Veritabanını Şuraya Dönüştür iletişim kutusunda, veritabanı dosyasının yeni adını yazın ve Kaydet'e tıklayın.

Access 2007

  1. Özgün veritabanının yedek kopyasını oluşturun.
  2. Bu veritabanını açmayı deneyin.
  3. Access 97 veya Access 95 dosya biçiminde bir .mdb veritabanını açtığınızda, Access Veritabanı Geliştirmesi iletişim kutusunu görüntüler. Veritabanını yükseltmeniz istenir.
  4. Veritabanını, Access 2007'de varsayılan dosya biçimi olarak seçtiğiniz dosya biçimine yükseltmek için Evet'e tıklayın. Veritabanını dönüştürdükten sonra, Access 2007'de dosya üzerinde tasarım değişiklikleri yapabilirsiniz. Bununla birlikte artık veritabanını, dönüştürdüğünüz sürümden önceki bir Access sürümünü kullanarak açamazsınız.

Yöntem 2: Özgün güvenilir olmayan veritabanına sahip değilken veritabanı verilerini ve veritabanı sorgularını kurtarma

Özgün güvenilir olmayan veritabanının bir kopyası özgün biçiminde yoksa ve standart bozulma giderme tekniklerini denediyseniz veritabanı verilerini ve veritabanı sorgularını kurtarmayı deneyin. Bunu yapmak için şu adımları uygulayın:

  1. Özgün veritabanının yedek kopyasını oluşturun.

  2. Access 2000 veya sonraki bir sürümü başlatın.

  3. Access 2000, Access 2002 veya Access 2003

    • Boş Access veritabanına tıklayın, Dosya adı kutusuna yeni veritabanı adını yazın ve Oluştur'a tıklayın.

    Access 2007

    • Yeni bir Office veritabanı oluşturmak için Office düğmesine tıklayın, Yeni'ye tıklayın, Boş Veritabanı'na ve sonra da Oluştur'a tıklayın.
  4. Access 2000, Access 2002 veya Access 2003

    • Ekle menüsünden Modül'e tıklayın. Microsoft Visual Basic Düzenleyicisi başlatılır ve yeni bir modül oluşturulur.

    Access 2007

    • Oluştur sekmesinde, Makro'nun altındaki aşağı oka tıklayın ve sonra Modül'e tıklayın. Microsoft Visual Basic Düzenleyicisi başlatılır ve yeni bir modül oluşturulur.
  5. Araçlar menüsünde, Başvurular'a tıklayın.

  6. Kullanılabilir Başvurular listesinde, Microsoft DAO 3.6 Nesne Kitaplığı'nı bulun ve Microsoft DAO 3.6 Nesne Kitaplığı onay kutusunu seçmek için tıklayın.

    Not

    DAO 3.6, Windows XP Home Edition'da da mevcuttur.

  7. Başvurular iletişim kutusunu kapatmak için Tamam'a tıklayın.

  8. Aşağıdaki kodu, oluşturduğunuz yeni modüle yapıştırın.

    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
    

    Not

    Kod, bozuk veritabanındaki tüm tabloları ve tüm sorguları geçerli veritabanına aktarmayı dener. C:\My Documents\yourDatabase.mdb öğesini, veritabanınızın doğru yol ve dosya adıyla değiştirin.

  9. Kodu çalıştırmak için Çalıştır menüsündeki Alt/Kullanıcı Formunu Çalıştır'a tıklayın.

Yöntem 3: Özgün güvenli veritabanınız yoksa veritabanı verilerini kurtarma

Özgün güvenli veritabanının özgün biçiminde bir kopyası yoksa ve standart bozulma sorunlarını giderme tekniklerini denediyseniz veritabanı verilerini kurtarmayı deneyin. Bunu yapmak için şu adımları uygulayın:

  1. Özgün veritabanının yedek kopyasını oluşturun.

  2. Access 2000 veya sonraki bir sürümü başlatın.

  3. Access 2000, Access 2002 veya Access 2003

    • Boş Access veritabanına tıklayın, Dosya adı kutusuna yeni veritabanı adını yazın ve Oluştur'a tıklayın.

    Access 2007

    • Boş bir veritabanı oluşturmak için Microsoft Office Düğmesi'ne tıklayın, Yeni'ye tıklayın, Boş Veritabanı'na ve ardından Oluştur'a tıklayın.
  4. Access 2000, Access 2002 veya Access 2003

    • Ekle menüsünden Modül'e tıklayın. Microsoft Visual Basic Düzenleyicisi başlatılır ve yeni bir modül oluşturulur.

    Access 2007

    • Oluştur sekmesinde, Makro'nun altındaki aşağı oka tıklayın ve sonra Modül'e tıklayın. Microsoft Visual Basic Düzenleyicisi başlatılır ve yeni bir modül oluşturulur.
  5. Araçlar menüsünde, Başvurular'a tıklayın.

  6. Kullanılabilir Başvurular listesinde, Microsoft DAO 3.6 Nesne Kitaplığı'nı bulun ve Microsoft DAO 3.6 Nesne Kitaplığı onay kutusunu seçmek için tıklayın.

  7. Başvurular iletişim kutusunu kapatmak için Tamam'a tıklayın.

  8. Aşağıdaki kodu, oluşturduğunuz yeni modüle yapıştırın.

    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
    

    Not

    Kod, bozuk veritabanındaki tüm tabloları yedek bir veritabanına aktarmayı dener. 10. adımdan sonra tablodaki değişkenleri, veritabanı dosya konumlarınız ve kullanıcı ayarlarınız ile değiştirin.

  9. İşlev listesinden BackupSecureDatabase öğesini seçin.

  10. Kodu çalıştırmak için Çalıştır menüsündeki Alt/Kullanıcı Formunu Çalıştır'a tıklayın.

    Değişken Açıklama
    strSecurePathToDatabase Güvenli veritabanı dosyasının konumu
    strSecurePathToWorkgroupFile Çalışma grubu dosyasının konumu
    strSecureUser Güvenli kullanıcı oturum açma adı
    strSecurePwd Güvenli kullanıcı oturum açma parolası
    strTempPathToDatabase Geçici veritabanı dosyasının konumu
    strBackupPathToDatabase Yedek veritabanı dosyasının konumu
    strLogPath Günlük dosyasının konumu

Durum

Microsoft bu sorunun "Uygulandığı öğe" bölümünde listelenen Microsoft ürünlerinde bulunduğunu onaylamıştır.

Daha Fazla Bilgi

Microsoft Access veritabanındaki bozulmaların giderilmesi hakkında daha fazla bilgi için aşağıdaki makaleye bakın:

Bir veritabanını sıkıştırma ve onarma