无法打开 Access 数据库 您所在的位置:网站首页 为什么office软件打不开 无法打开 Access 数据库

无法打开 Access 数据库

2024-06-05 14:48| 来源: 网络整理| 查看: 265

在 Access 中打开数据库时出现“数据库状态异常”错误 项目03/18/2023 适用于: Access 2019, Access 2016, Access 2013, Access 2010, Microsoft Office Access 2007, Microsoft Office Access 2003

本文修复了使用 DAO 库转换数据库时发生的问题。

原始 KB 编号: 888634

注意

本文适用于 Microsoft Access 数据库 (.mdb) 文件或 Microsoft Access 数据库 (.accdb) 文件。 需要具备基本的宏、编码和互操作性技能。

症状

尝试在 Microsoft Access 2000 或更高版本中打开数据库时,会收到以下错误消息:

数据库状态异常

原因

使用数据访问对象 (DAO) 库转换使用 CompactDatabase 方法在 Microsoft Access 97 或早期版本中创建的数据库时,可能会出现此问题。 CompactDatabase 方法可能会使新数据库处于部分转换状态。

解决方案

若要解决此问题,请使用以下方法之一。

方法 1:如果有原始数据库,请使用“转换数据库”命令

如果仍有采用原始格式的原始数据库的副本,请使用 Convert Database 命令。 为此,请按照下列步骤操作:

Access 2000、Access 2002 或 Access 2003

创建原始数据库的备份副本。

启动 Access 2000 或更高版本。

在“工具”菜单上,依次单击“数据库实用程序”、“转换数据库”以及“转换为 Access 2000 文件格式”。

注意

如果使用的是 Access 2000, 则“转换数据库”菜单上只显示“转换为当前 Access 数据库版本”。

在“数据库转换来源”对话框中,单击要转换的数据库文件名,然后单击“转换”。

在“将数据库转换为”对话框中,键入数据库文件的新名称,然后单击“保存”。

Access 2007 创建原始数据库的备份副本。 尝试打开该数据库。 打开 Access 97 或 Access 95 文件格式 .mdb 数据库时,Access 将显示“数据库增强功能”对话框。 系统将提示你升级数据库。 单击“是”将数据库升级到在 Access 2007 中选择作为默认文件格式的任何文件格式。 转换数据库后,可以在 Access 2007 中对文件进行设计更改。 但是,你无法再使用早于将数据库转换到的 Access 版本打开数据库。 方法 2:如果没有原始非安全数据库,则恢复数据库数据和数据库查询

如果没有采用其原始格式的原始非安全数据库的副本,并且尝试过标准损坏故障排除技术,请尝试恢复数据库数据和数据库查询。 为此,请按照下列步骤操作:

创建原始数据库的备份副本。

启动 Access 2000 或更高版本。

Access 2000、Access 2002 或 Access 2003

单击“空白 Access 数据库”,在“文件名”框中键入新数据库名称,然后单击“创建”。

Access 2007

单击“Office”按钮,单击“新建”,单击“空白数据库”,然后单击“创建”以新建空白数据库。

Access 2000、Access 2002 或 Access 2003

在“插入”菜单上,单击“模块”。 Microsoft Visual Basic 编辑器启动,并新建一个模块。

Access 2007

在“创建”选项卡上,单击“宏”下方的向下箭头,然后单击“模块”。 Microsoft Visual Basic 编辑器启动,并新建一个模块。

在“工具”菜单上,单击“引用”。

在“可用引用”列表中,找到“Microsoft DAO 3.6 对象库”,然后单击以选中“Microsoft DAO 3.6 对象库”复选框。

注意

DAO 3.6 也适用于 Windows XP 家庭版。

要关闭“引用”对话框,请单击“确定”。

将以下代码粘贴到新建的模块中。

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

注意

代码将尝试将损坏数据库中的所有表以及所有查询导入当前数据库。 将 C:\My Documents\yourDatabase.mdb 替换为数据库的正确路径和文件名。

要运行代码,请单击“运行”菜单上的“运行子窗体/用户窗体”。

方法 3:如果没有原始安全数据库,则恢复数据库数据

如果没有采用原始格式的原始安全数据库的副本,并且尝试过标准损坏故障排除技术,请尝试恢复数据库数据。 为此,请按照下列步骤操作:

创建原始数据库的备份副本。

启动 Access 2000 或更高版本。

Access 2000、Access 2002 或 Access 2003

单击“空白 Access 数据库”,在“文件名”框中键入新数据库名称,然后单击“创建”。

Access 2007

单击“Microsoft Office 按钮”,单击“新建”,单击“空白数据库”,然后单击“创建”以新建空白数据库。

Access 2000、Access 2002 或 Access 2003

在“插入”菜单上,单击“模块”。 Microsoft Visual Basic 编辑器启动,并新建一个模块。

Access 2007

在“创建”选项卡上,单击“宏”下方的向下箭头,然后单击“模块”。 Microsoft Visual Basic 编辑器启动,并新建一个模块。

在“工具”菜单上,单击“引用”。

在“可用引用”列表中,找到“Microsoft DAO 3.6 对象库”,然后单击以选中“Microsoft DAO 3.6 对象库”复选框。

要关闭“引用”对话框,请单击“确定”。

将以下代码粘贴到新建的模块中。

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

注意

代码将尝试将损坏数据库中的所有表导入备份数据库。 将步骤 10 后的表中的变量替换为数据库文件位置和用户设置。

在函数列表中,选择“BackupSecureDatabase”。

要运行代码,请单击“运行”菜单上的“运行子窗体/用户窗体”。

变量 说明 strSecurePathToDatabase 安全数据库文件的位置 strSecurePathToWorkgroupFile 工作组文件的位置 strSecureUser 安全的用户登录名 strSecurePwd 安全的用户登录密码 strTempPathToDatabase 临时数据库文件的位置 strBackupPathToDatabase 备份数据库文件的位置 strLogPath 日志文件的位置 状态

Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。

更多信息

要详细了解如何解决 Microsoft Access 数据库中的损坏问题,请参阅以下文章:

压缩和修复数据库



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有