Ms access 损坏的Access 2010数据库-恢复查询定义

Ms access 损坏的Access 2010数据库-恢复查询定义,ms-access,vba,ms-access-2010,corruption,Ms Access,Vba,Ms Access 2010,Corruption,我有一个Access DB,它是一个本地开发拷贝,不是生产拷贝,并且在(讽刺的是)压缩和修复过程中损坏了大量数据。不幸的是,我在这方面做了很多工作,我确实有一个备份计划,但我失败了 当我启动它时,它会给我一些无用的错误信息,比如: 'Id'不是此表中的索引。 “ParentIdName”不是此表中的索引。 我假设这些索引是数据库中隐藏的MSys*表的一部分。我设法读取了这些数据,它们大部分是空的,而我的旧的健康备份在这些表中有很多数据 首先,我尝试使用VBA和ADO连接(事先制作了一个副本)将正

我有一个Access DB,它是一个本地开发拷贝,不是生产拷贝,并且在(讽刺的是)压缩和修复过程中损坏了大量数据。不幸的是,我在这方面做了很多工作,我确实有一个备份计划,但我失败了

当我启动它时,它会给我一些无用的错误信息,比如:
'Id'不是此表中的索引。

“ParentIdName”不是此表中的索引。

我假设这些索引是数据库中隐藏的MSys*表的一部分。我设法读取了这些数据,它们大部分是空的,而我的旧的健康备份在这些表中有很多数据

首先,我尝试使用VBA和ADO连接(事先制作了一个副本)将正常的表恢复到已破坏的表中,我收到很多错误,说我没有对表的写入权限

下一次尝试(仍在进行中)是通过相同的ADO连接(也尝试了ADOX和DAO)恢复查询定义(90%以上的更改)

最成功的尝试是ADO:

Sub DebugPrintQueryDefsADO()

    Dim dmgDB As DAO.Database
    Dim dmgQD As DAO.QueryDef

    Set dmgDB = DBEngine.OpenDatabase("C:\Database.accdb", , True)

    For Each dmgQD In dmgDB.QueryDefs

        If Left(dmgQD.Name, 1) <> "~" Then ' ~ Query defs seem to be the form views'
            Debug.Print "---------------------------------"
            Debug.Print dmgQD.Name
            Debug.Print "---------------------------------"
            Debug.Print dmgQD.SQL
        End If

    Next dmgQD

    Set dmgQD = Nothing
    Set dmgDB = Nothing    

End Sub
Sub-DebugPrintQueryDefsADO()
Dim dmgDB作为DAO.Database
Dim dmgQD为DAO.QueryDef
设置dmgDB=DBEngine.OpenDatabase(“C:\Database.accdb”,True)
对于dmgDB.querydfs中的每个dmgQD
如果左键(dmgQD.Name,1)“~”则“~Query defs似乎是表单视图”
调试。打印“-------------------------------------”
Debug.Print dmgQD.Name
调试。打印“-------------------------------------”
调试。打印dmgQD.SQL
如果结束
下一个dmgQD
设置dmgQD=Nothing
设置dmgDB=Nothing
端接头
这确实有效!只要查询定义计算首先运行良好。在我的例子中,这对于大多数QD来说不可能是真的,因为表格是在需要时导入然后删除的。这意味着无法找到QD中定义的字段,因为表不存在。然后Access向我显示一个错误:

3258:无法执行SQL语句,因为它包含不明确的外部联接。要强制首先执行其中一个联接,请创建一个单独的查询来执行第一个联接,然后将该查询包含在SQL语句中。

回家吧,你喝醉了

下一个任务是找出如何不计算SQL语句(我只需要SQL语句,不需要结果)。我发现在Access 2007文档中有一个属性:
Querydef.Prepare

根据文档(Access 2007,我有2010),我应该设置
Querydef.Prepare=dbQUnprepare
。但这是行不通的

长话短说

  • 有人知道修复损坏数据库的方法吗
或者

  • 有人知道如何从查询定义中检索我的SQL语句而不需要对它们求值吗

谢谢

您可以尝试的一个选项是

Application.SaveAsText acQuery,“QueryName”,“C:\path\QueryName.txt”
至少在某些情况下,它会在文件开头转储SQL字符串(带有一些任意的中断和转义字符,只是为了保持有趣)。例如:

dbMemo“SQL”=“选择年(分配的。[日期])作为年,选择月(分配的。[日期])作为月,选择和(分配的。[”
“工时])作为Hrs\015\012从项目上分配的内部联接项目中删除。[Proj”
“ect名称]=已分配。[项目名称]\015\012WHERE Projects.bilable\015\012GROUP”
按年份(分配的[日期]),月份(分配的[日期]);\015\012
dbMemo“连接”=“”
dbBoolean“ReturnsRecords”=“-1”
dbInteger“ODBCTimeout”=“60”
dbBoolean“OrderByOn”=“0”
dbByte“方向”=“0”
dbByte“DefaultView”=“2”
dbBinary“GUID”=开始
0x1304ebdf78bef2459211d478954077cd
终点
dbBoolean“FilterOnLoad”=“0”
dbBoolean“OrderByOnLoad”=“-1”
dbLongBinary“DOL”=开始
0x0ACC0E55000000534C617867B4D43B98002A1B002C8EB00000000C732603A,
0xA958E44000000000000000410073007300690067006E006500640000000000,
0x00006B84DFE37AEC2248A1CCFE3E157361DF000000040B3AFFDA358E440000,
0x000000000000500072006F006A00650063007073000000000000000D5B092F5,
0x1C1339484636D668E6607000001304EBDF78BEF2459211D478954077CD,
0x590072000000000000EFA363BC29CBFC478A958E7B935D03DA07000001304,
0xebdf78bef2459211d478954077cd4d006f00000000000000b1174c1abe1d3d4c,
0xB9A1A7E5915A2E4707000001304EBDF78BEF2459211D478954077CD48007200,
0x7300000000000000B2E4AA9AB3A9E479C47B2772754FCE107000000534C617,
0x867B4D43B98002A1B002C8EB440061007400650000000000000404C4C3A80EF29,
0xA4498E153E354319E84C0700000534CC617867B4D43B98002A1B002C8EB4800,
0x6F00750072007300200057006F0072006B06500640000000000A3A95ACB,
0xE7EC994BAB8DF870CE5B3D980700006B84DFE37AEC2248A1CCFE3E157361DF,
0x500072006F006A006500630074020004E0061006D006500000000000000F5CB,
0xefb11bcf5e4da4b2806eed09a70207000000534cc617867b4d43b98002a1b002,
0xC8EB500072006F006A0065006307400200004E0061006D006500000000000000,
0x453445BF7E67B54EAD2C9317CA29D90607000006B84DFE37AEC2248A1CCFE3E,
0x157361DF42069006C006C006C00610062006C006500000000000000000000000000,
0x000000000000000C000000050000000000000000000000000000
终点
数据库字节“PublishToWeb”=“1”
开始
开始
dbText“名称”=“年”
dbLong“聚合类型”=“-1”
dbBinary“GUID”=开始
0xd5b092f51c13394884636d668e066e66
终点
终点
开始
dbText“名称”=“Mo”
dbLong“聚合类型”=“-1”
dbBinary“GUID”=开始
0xefa363bc29cbfc478a958e7b935d03da
终点
终点
开始
dbText“名称”=“小时”
dbLong“聚合类型”=“-1”
dbBinary“GUID”=开始
0xB1174C1ABE1D34B9A1A7E5915A2E47
终点
终点
终点

如果您有数据库的副本,但该副本刚刚损坏,并且您没有尝试任何可能会更改数据库的内容,则可以使用AccessFix.com上的Access Fix