문제

이 데이터베이스 응용 프로그램을 작업하는 동안 분명히 응용 프로그램의 양식이 손상되었습니다. 양식의 필드에 대한 편집 내용을 저장하려고 하면 Access가 중단되고 Access가 시도할 때 데이터베이스 파일이 손상되었다고 보고됩니다. 다시 열어보세요.

전체 양식 + 컨트롤을 텍스트로 내보낸 다음 VB 코드(Allen Browne의 웹 사이트에서)를 사용하여 다시 가져오려고 했지만 Access가 충돌하거나 양식을 가져올 수 없다는 메시지가 표시되지 않으면 다시 가져오지 않습니다. 오류(오류 번호나 설명 없음)

양식이 좀 복잡해서 그냥 처음부터 다시 만들까 망설여지는데 저장하는 방법이 없을까요?복구에 성공하면 모든 것을 새 MDB 파일로 전송해야 한다는 의미입니까(연속적인 실패 영향인 경우)?

솔직히 말해서 저는 이전에 Access 데이터베이스 개체를 손상시킨 적이 없었기 때문에 이것이 해당 MDB 파일의 끝을 알리는 신호인지, 아니면 수정하고 이전처럼 계속할 수 있는 것인지 모르겠습니다.

도움이 되었습니까?

해결책 2

내가해야 할 일은 양식을 재창조하고 strsupplierid 콤보 상자 자체가 충돌의 원인이라는 것을 알 때까지 요소별로 요소를 복사하는 것이 었습니다. 나는 그것을 처음부터 다시 만들어서 수동으로 동일한 특성을 제공하고, 클립 보드에 붙여 넣은 저장된 사본에서 VB를 교체했습니다. 양식은 이제 작동하고 손상된 양식을 제거하고 데이터베이스를 압축했습니다. 도와 주셔서 감사합니다, 모두! :)

다른 팁

다른 사람들은 손상된 양식을 복구할 수 있는 다양한 접근 방식을 제공했습니다.코드가 포함된 Access 개체가 복구할 수 없을 정도로 손상되어 이러한 방법 중 어느 것도 작동하지 않는 경우가 있습니다.이 경우, 시작점으로 손상되지 않은 버전을 찾기 위해 백업을 살펴보고 이를 가져온 다음 개체의 현재 상태로 다시 수정해야 합니다.

코드가 포함된 개체가 손상되는 경우 코딩 방법을 변경해야 할 수도 있음을 제안하기 위해 답변을 게시하고 있습니다.

  1. 첫째, 정기적인 백업을 유지하고 덮어쓰지 않도록 해야 합니다.이전 버전으로 롤백하는 것은 항상 최후의 수단입니다.

  2. VBE 옵션에서 항상 COMPILE ON DEMAND를 끄십시오.Michael Kaplan의 기사 읽기 디컴파일 스위치의 실제 거래 이유에 대한 설명을 위해.

  3. VBE에서 일반 VBE 도구 모음에 컴파일 버튼(및 호출 스택 버튼)을 추가하고 코드 몇 줄마다 해당 컴파일 버튼을 누르고 코드를 저장합니다.

  4. 앱을 백업하고 디컴파일하는 합리적인 간격을 결정하세요.엄청난 양의 코드를 작성하는 경우 매일 이 작업을 수행하고 싶을 수도 있습니다.코딩 중에 Access 충돌이 발생한 경우 백업을 만들고 디컴파일/재컴파일하는 것이 좋습니다.물론 사용자에게 배포하기 전에 앱을 디컴파일하고 다시 컴파일해야 합니다.

이러한 관행을 따르면 코드가 포함된 액세스 개체의 손상 원인이 최대한 최소화되는 동시에 많은 백업을 갖게 됩니다. 백업이 실패하면 거의 실패하기 때문에 여러 수준의 중복 백업이 필수입니다. 항상 여러 수준에 걸쳐 계단식으로 배열됩니다. 여러 유형의 백업이 있고 자동 백업에 의존하지 않습니다.

하지만 핵심은 다음과 같습니다.

자주 컴파일하고, 합리적으로 자주 디컴파일하면 문제가 되는 내용이 애플리케이션의 p 코드에 축적될 기회가 결코 없습니다.

Decompile은 데이터베이스 사본을 만든 후에는 시도하는 것이 좋습니다. 파일 >> 저장으로 다른 이름으로 양식을 저장해 보셨습니까? 또한 데이터베이스 창과 다른 이름으로 양식을 복사하고 붙여 넣으십시오.

또한 하나의 부패한 양식/보고서가 데이터베이스의 나머지 부분에 퍼지지 않는 것이 저의 경험이었습니다. 그것은 물건을 청소하는 것이 아프지 않다고 말했습니다. 소형 및 수리는 인덱스 및 관계와 같은 테이블 및 관련 데이터 만 수정합니다. 양식 및 보고서와 같은 다른 물체를 손상시켜 새 MDB/ACCDB로 가져와야합니다. 팁 : 객체가 많으면 데이터베이스 컨테이너 창을 닫습니다. 데이터베이스 컨테이너 창을 새로 고침하는 동안 액세스가 많은 시간을 낭비합니다.

Allen Browne의 부패를 다루는 전체 방법을 살펴 보셨습니까? http://allenbrowne.com/ser-47.html ? 특히, 디 컴파일.

컨트롤의 복사 및 붙여 넣기를 시도하고 코드에 점차적으로 추가 할 가치가 있습니다.

나는 그 일이 여러 번 일어났습니다. 여기 내 베이컨을 구한 몇 가지가 있습니다. Access 2003 이상을 사용하고 있다고 가정합니다. 데이터베이스를 2002 또는 2000 형식으로 액세스하도록 변환하십시오. 그런 다음 해당 데이터베이스를 현재 버전으로 다시 변환하십시오.

다음은 이전 버전에서 Bloat와 싸우기 위해 만든 몇 가지 코드입니다. 또한이 문제를 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 개 이상의 열이있는 콤보 상자가 액세스 형태를 손상시킬 수 있음을 발견했습니다. 열의 수를 줄이거 나 콤보 상자를 제거하여 양식이 제대로 저장되는지 확인하십시오. 이 문제는 Access 2003 데이터베이스와 함께 Win 7 64 비트 운영 체제에서 작업하는 것과 관련이 있습니다. XP에서 개발할 때 문제가 없었습니다. 즉, 양식은 콤보 상자에 큰 열 수로 잘 저장됩니다. 이 정보가 데이터베이스가 손상되었다고 생각하는 시간이 많이 낭비되기 때문에 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top