在我在此数据库应用程序上的工作期间,我显然设法损坏了应用程序中的表单 - 试图将任何编辑保存到表单上的任何字段都会导致访问崩溃,以及在访问尝试尝试访问时报告损坏的数据库文件重新打开它。

我尝试将整个表单 +控件导出为文本,然后使用VB代码(来自Allen Browne的网站)重新介绍它们,但是如果不崩溃访问或告诉我该表单不可导入,则不会重新登录。出错(没有错误号码或描述给出)。

表格很复杂,因此我不愿从头开始重新整理它,所以有办法保存它吗?如果我确实设法恢复了它,这是否意味着我应该将所有内容转移到新的MDB文件(以防它是级联故障效应的情况下)?

老实说,我以前从未设法损坏访问数据库对象,因此我不知道这是否标志着该MDB文件的末尾,或者只是我可以纠正并像以前一样继续的东西。

有帮助吗?

解决方案 2

我最终要做的就是重新创建表单,然后按元素复制元素,直到我发现strsupplierid组合盒本身就是崩溃的原因。我从头开始重新创建了它,手动提供了相同的属性,并从我切割并粘贴到剪贴板上的存储副本中代替了VB。该表格现在有效,我删除了损坏的表单,并压实了数据库。感谢您的帮助,大家! :)

其他提示

其他人为您提供了各种方法,以恢复您的损坏形式。有时,包含密码的访问对象会变得不可挽回地损坏,并且这些方法都不会起作用。在这种情况下,您必须查看备份以找到非腐败版本作为起点并导入该版本,然后将其修改回对象的当前状态。

我要发布一个答案,以表明如果您在代码对象中遇到损坏,可能需要更改编码实践。

  1. 首先,您需要确保保留定期备份并且不要覆盖它们。回到较早版本始终是最后的手段。

  2. 始终关闭VBE选项中的按需编译。阅读迈克尔·卡普兰(Michael Kaplan)的文章 反编译开关的真正交易 为了解释原因。

  3. 在VBE中,将“编译”按钮(和“调用堆栈”按钮)添加到常规VBE工具栏中,并在每几行代码后点击该编译按钮,然后保存代码。

  4. 确定一个合理的间隔以备份并对您的应用程序进行反复编译。如果您要进行重型代码重击,则可能每天都需要这样做。如果您在编码过程中遇到了访问崩溃,则可能需要进行备份和反编译/重编译。当然,在向用户分发之前,您应该对应用程序进行反编译和重新编译。

如果您遵循这些做法,则必须尽可能地最小化代码访问对象中损坏的原因,而您也将有很多备份(必须有多个冗余备份,因为当备份失败发生时,它们几乎几乎是始终通过多个级别级联 - 具有多种类型的备份,并且不依赖自动备份)。

但是关键点:

经常进行编译,经常合理地编译,而iCky的内容将永远不会有机会在您的应用程序的P代码中积累。

一旦您制作了数据库的副本,反编译是一件好事。您是否尝试使用文件>>另存为其他名称下的表格?同样,请尝试从数据库窗口复制和粘贴以不同名称的表单。

同样,我的经验是,一个损坏的表格/报告不会传播到数据库的其余部分。也就是说,清理东西没有什么伤害。紧凑和维修仅修复表格和相关数据,例如索引和关系。要清理损坏的其他对象,例如表格和报告,您必须将它们导入新的MDB/ACCDB。提示:如果您有很多对象,请关闭数据库容器窗口。访问在导入过程中浪费大量时间,然后刷新数据库容器窗口。

您是否查看了处理艾伦·布朗(Allen Browne)腐败的完整方法: http://allenbrowne.com/ser-47.html ?特别是编译。

可能值得尝试将控件的副本和粘贴到新的形式中,然后逐渐添加到代码中。

我已经发生过很多次。这里有几件事可以节省我的培根。我假设您正在使用Access 2003或更高版本。尝试将数据库转换为访问2002或2000格式。然后将该数据库转换回您当前版本。

这是我创建的一些代码,以对抗以前的版本。它也为我95%的时间解决了这个问题。

选项比较数据库选项显式

Private Sub cmdCreateDuplicate_Click()
'********************************************************
' Author        Daniel Tweddell
' Revision Date 10/27/05
'
' To Combat bloat, we are recreating the a new database
'********************************************************
On Error GoTo Err_Function
    Dim strNewdb As String
    Dim AppNewDb As New Access.Application 'the new database we're creating to manage the updates
    strNewdb = CurrentProject.Path & "\db1.mdb"
    SysCmd acSysCmdSetStatus, "Creating Database. . ."
    With AppNewDb
        DeleteFile strNewdb 'make sure it's not already there
        .Visible = False 'hear no database see no database
        .NewCurrentDatabase strNewdb 'open it
        ChangeRemoteProperty "StartupShowDbWindow", AppNewDb, , dbBoolean, False
        ChangeRemoteProperty "Auto compact", AppNewDb, , dbBoolean, True
        ImportReferences AppNewDb, Application
        .CloseCurrentDatabase
    End With
    Set AppNewDb = Nothing
    Dim ao As AccessObject
    For Each ao In CurrentData.AllTables
        If Left(ao.Name, 4) <> "msys" Then
            DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acTable, ao.Name, ao.Name
            SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
        End If
    Next
    For Each ao In CurrentData.AllQueries
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acQuery, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllForms
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acForm, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllReports
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acReport, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllMacros
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acMacro, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    For Each ao In CurrentProject.AllModules
        DoCmd.TransferDatabase acExport, "Microsoft Access", strNewdb, acModule, ao.Name, ao.Name
        SysCmd acSysCmdSetStatus, "Exporting " & ao.Name & ". . ."
    Next
    MsgBox "Creation Complete!" & vbCrLf & "Reset Password", vbExclamation, "New Database"
Exit Sub
Err_Function:
    ErrHandler Err.Number, Err.Description, Me.Name & " cmdCreateDuplicate_Click()"
End Sub


Function DeleteFile(ByVal strPathAndFile As String) As Boolean
'***********************************************************************************
' Author        Daniel Tweddell
' Revision Date 04/14/03
'
' Deletes a file
'***********************************************************************************
On Error GoTo Err_Function
    DeleteFile = True                   'default to true
    If UncDir(strPathAndFile) <> "" Then   'make sure the file is there
        Kill strPathAndFile             'delete a file
    End If
Exit Function
Err_Function:
    ErrHandler Err.Number, Err.Description, "DeleteFile()", bSilent
    DeleteFile = False                  'if there is a problem, false
End Function

Public Sub ChangeRemoteProperty(strPropName As String, _
                                appToDB As Access.Application, Optional appFromDB As Access.Application, _
                                Optional vPropType As Variant, Optional vPropValue As Variant)
'********************************************************************************
' Author        Daniel Tweddell
' Revision Date 01/13/04
'
' Changes/adds a database property in one db to match another
'********************************************************************************
On Error GoTo Err_Function
    Dim ToDB As DAO.Database
    Dim FromDB As DAO.Database
    Dim prpTest As DAO.Property
    Dim bPropertyExists As Boolean
    Set ToDB = appToDB.CurrentDb
    If Not appFromDB Is Nothing Then Set FromDB = appFromDB.CurrentDb
    bPropertyExists = False 'flag to see if we found the property
    For Each prpTest In ToDB.Properties 'first see if the property exists so we don't error
        If prpTest.Name = strPropName Then
            If IsMissing(vPropValue) Then vPropValue = FromDB.Properties(strPropName) 'in case we want to assign it a specific value
            ToDB.Properties(strPropName) = vPropValue 'if it does set it and get out or the loop
            bPropertyExists = True
            Exit For
        End If
    Next
    If Not bPropertyExists Then ' Property not found.
        Dim prpChange As DAO.Property
        If IsMissing(vPropValue) Then
            With FromDB.Properties(strPropName)
                vPropValue = .Value 'in case we want to assign it a specific value
                vPropType = .Type
            End With
        End If
        Set prpChange = ToDB.CreateProperty(strPropName, vPropType, vPropValue) 'add it
        ToDB.Properties.Append prpChange
    End If
Exit Sub
Err_Function:
    ErrHandler Err.Number, Err.Description, "ChangeRemoteProperty()", bSilent
End Sub

Public Sub ImportReferences(AppNewDb As Access.Application, appUpdateDB As Access.Application, Optional iStatus As Integer)
'********************************************************************************
' Author        Daniel Tweddell
' Revision Date 01/13/04
'
' Copies the current references from the one database to another we're building
'********************************************************************************
On Error GoTo Err_Function
    Dim rNewRef As Reference
    Dim rUpdateRef As Reference
    Dim bReferenceExists As Boolean
    Dim rToAdd As Reference
    Dim sReference As String
    If iStatus <> 0 Then ProgressBarUpdate iStatus, "Referencing Visual Basic Libraries. . ."
    For Each rUpdateRef In appUpdateDB.References
        bReferenceExists = False
        For Each rNewRef In AppNewDb.References
            sReference = rNewRef.Name
            If rUpdateRef.Name = sReference Then
                bReferenceExists = True
                Exit For
            End If
        Next
        If Not bReferenceExists Then
            With rUpdateRef
                Set rToAdd = AppNewDb.References.AddFromGuid(.Guid, .Major, .Minor)
            End With
        End If
    Next
Exit Sub
Err_Function:
    ErrHandler Err.Number, Err.Description, "ImportReferences(" & sReference & ")", bSilent
    Resume Next
End Sub

我发现具有10列或更多列的组合框可能会导致访问表格损坏。尝试减少列的数量或删除组合框以查看表单是否正确保存。这个问题与在WIN 7 64位操作系统中使用访问2003数据库有关。用XP开发XP时没有问题,换句话说,在组合框中使用大量的列计数可以很好地节省。希望这些信息会有所帮助,因为它造成了很多浪费的时间,认为数据库已损坏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top