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 数据库中的损坏问题,请参阅以下文章:压缩和修复数据库
反馈
查看所有页面反馈
}
1、中文版Access2007实用教程第04章创建与使用表教学重点与难点 创立表 设置字段的数据类型 输入掩码 设置有效性规那么和有效性文本 设置主键和索引 4.1 创立表 表是关系型数据库系统的根本构造,是关于特定主题数据的集合。与其他数据库管理系统一样,Access中的表也是由构造和数据两局部组成。 输入数据创立表 使用模板创立表 使用表设计器创立表 输入数据创立表是指在空白数据表中添加字段名和数据,同时Access会根据输入的记录自动地指定字段类型。 4.1.1 输入数据创立表 使用模板创立表是一种快速建表的方式,这是由于Access在模板中内置了一些常见的例如表,这些表中都包含了足够多的字2、段名,用户可以根据需要在数据表中添加和删除字段。 4.1.2 使用模板创立表 表设计器是一种可视化工具,用于设计和编辑数据库中的表。该方法以设计器所提供的设计视图为界面,引导用户通过人机交互来完成对表的定义。利用表向导创立的数据表在修改时也需要使用表设计器。 4.1.3 使用表设计器创立表4.2 设置字段属性 使用设计视图创立表是Access中最常用的方法之一,在设计视图中,用户可以为字段设置属性。在Access数据表中,每一个字段的可用属性取决于为该字段选择的数据类型。本节将详细地讲述字段属性的设置方法,以及如何在设计视图中修改数据表。 字段数据类型 选择数据格式 改变字段大小 输入掩码 设3、置有效性规那么和有效性文本 设定表的索引 字段的其他属性 Access 2007定义了11种数据类型,在表设计窗口“数据类型单元格的下拉列表中显示了11种数据类型。有关数据类型的详细说明如表所示。 4.2.1 字段数据类型数 据 类 型使 用 说 明字 段 大 小文本(Text)文本类型或文本与数字类型的结合,与数字类型一样,都不需要计算,例如姓名最多可用255个字符或是由FieldSize属性设置长度。Microsoft Access不会为文本字段中未用的部分保留空格备注(Memo)长文本类型或文本与数字类型的组合最多可用640000个字符数字(Number)用于数学计算中的数值数据。关于如4、何设定特殊数字类型,可以查看FieldSize属性的说明1、2、4或8个字节日期/时间(Date/Time)日期/时间数值得设定范围为1009999年8个字节货币(Currency)用于数学计算的货币数值与数值数据,包含小数点后14位。整数位最多有15位8个字节自动编号(Auto Number)每当向表中添加一条新的记录时,由Access指定的一个惟一的顺序号(每次递增1)或随机数。自动编号字段不能更新4个字节是/否(Yes/No)“是”和“否”的数值与字段只包含两个数值(True/False或On/Off)中的一个1位超级链接(Hyperlink)保存超级链接的字段。超级链接可以是某个文件的5、路径UNC路径或URL最长为64000个字节OLE对象(OLE Object)联接或内嵌于Access数据表中的对象,可以是Excel电子表、Word文件、图形、声音或其他二进制数据最多可用10亿字节,受限于所用的磁盘空间查询向导(Lookup Wizard)创建字段,该字段将允许使用组合框来选择另一个表或一个列表中的值。从数据类型列表中选择此选项,将打开向导以进行定义通常为4个字节附件可以将多个文件存储在单个字段之中,也可以将多种类型的文件存储在单个字段之中最多可以附加2GB的数据,单个文件的大小不得超过256MB(续表) Access允许为字段数据选择一种格式,“数字、“日期/时间和“是/6、否字段都可以选择数据格式。选择数据格式可以确保数据表示方式的一致性。 4.2.2 选择数据格式 Access允许更改字段默认的字符数。改变字段大小可以保证字符数目不超过特定限制,从而减少数据输入错误。 4.2.3 改变自动大小 “输入掩码属性用于设置字段、文本框以及组合框中的数据格式,并可对允许输入的数值类型进展控制。要设置字段的“输入掩码属性,可以使用Access自带的“输入掩码向导来完成。例如设置 号码字段时,可以使用掩码引导用户准确地输入格式为( )- 。 4.2.4 输入掩码 当输入数据时,有时会将数据输入错误,如将薪资多输入一个0,或输入一个不合理的日期。事实上,这些错误可以利用“有7、效性规那么和“有效性文本两个属性来防止。 “有效性规那么属性可输入公式(可以是比较或逻辑运算组成的表达式),用在将来输入数据时,对该字段上的数据进展查核工作,如查核是否输入数据、数据是否超过范围等;“有效性文本属性可以输入一些要通知使用者的提示信息,当输入的数据有错误或不符合公式时,自动弹出提示信息。 4.2.5 设置有效性规那么和有效性文本 简单的说,索引就是搜索或排序的根据。也就是说,当为某一字段建立了索引,可以显著加快以该字段为根据的查找、排序和查询等操作。但是,并不是将所有字段都建立索引,搜索的速度就会到达最快。这是因为,索引建立的越多,占用的内存空间就会越大,这样会减慢添加、删除和更新记录的速度。 设置表的主键 创立索引 4.2.6 设置}

我要回帖

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

更多推荐

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

点击添加站长微信