OFFICE access无法打开应用程序较早版本 2007 打开时显示:”不能打开其他表了“这种情况如何解决?


项目
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 数据库中的损坏问题,请参阅以下文章:压缩和修复数据库
反馈
查看所有页面反馈
}

我要回帖

更多关于 access无法打开应用程序较早版本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信