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
Özgün veritabanının yedek kopyasını oluşturun.
Access 2000 veya sonraki bir sürümü başlatın.
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.
Ş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.
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
- Özgün veritabanının yedek kopyasını oluşturun.
- Bu veritabanını açmayı deneyin.
- 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.
- 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:
Özgün veritabanının yedek kopyasını oluşturun.
Access 2000 veya sonraki bir sürümü başlatın.
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.
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.
Araçlar menüsünde, Başvurular'a tıklayın.
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.
Başvurular iletişim kutusunu kapatmak için Tamam'a tıklayın.
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.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:
Özgün veritabanının yedek kopyasını oluşturun.
Access 2000 veya sonraki bir sürümü başlatın.
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.
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.
Araçlar menüsünde, Başvurular'a tıklayın.
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.
Başvurular iletişim kutusunu kapatmak için Tamam'a tıklayın.
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.
İşlev listesinden BackupSecureDatabase öğesini seçin.
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:
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin