2014-08-27 3 views
3

트랜잭션 (BeginTrans/CommitTrans/Rollback) 사용 후 MS-Access 2010 환경이 불안정한 것 같습니다. 불안정한 말은 MS-Access 환경이 더 이상 객체 수정을 허용하지 않는다는 것입니다 (자동으로 일종의 독점 모드로 변경됨). 프로세스의 SQL 쿼리를 실행하는 동안 예기치 않은 오류 메시지가 표시됩니다.MS Access 2010 : 양식에 트랜잭션 관리 추가

상황 :

는 나는 새 VBA 모듈을 추가 한 MS-액세스 2010 데이터베이스 (accdb 형식)이있다. 이 모듈은 레코드를 데이터베이스의 테이블에로드하기 위해 주어진 파일을 처리합니다. 나는이 DB (별도의 응용 프로그램 아님)로 작업하기 위해 MS-Access 2010 환경을 사용합니다.

각 레코드에 대해 db에 저장되기 전에 몇 가지 검증이 이루어졌습니다. 오류가 감지되면 모든 처리가 취소됩니다. 트랜잭션을 사용하여 전체 파일이 정상적으로로드되었는지 확인합니다.

문제 :

  1. 나는 그것이 정확하고 그래서 COMMIT으로 완료이 과정을 처음 실행할 때이 프로세스가 자신의 처리 결과를 상관하지 않고 다른 파일을 다시 실행 할 수 있습니다. 각 처리의 결과는 파일의 데이터 품질에만 의존합니다.

  2. 그러나이 프로세스를 처음 실행하면 ROLLBACK으로 끝나고 프로세스의 모든 다음 실행은 프로세스에서 SQL 쿼리를 실행하는 동안 오류로 끝납니다.

MS-Access 환경은 일종의 단독 모드로 바뀝니다.

질문 :

가 VBA 모듈의 종류 또는 MS-액세스 2010 개발 환경 준수 처리인가? 또는 내 Access 데이터베이스에 연결하여 파일 처리를 실행하는 새로운 별도의 응용 프로그램을 빌드해야합니다.

코드 (간체) :

Private Sub Comando0_Click() 'A success processing simulation 
    On Error GoTo ErrManagenent 

    BeginTrans 

    'Some procesing finishin OK 
    ProcessWithoutError 

    CommitTrans 
    Exit Sub 

ErrManagenent: 

    Debug.Print "Comando0_Click Error: " & Err.Description & "." & vbCrLf & Err.Source 

    Rollback 
End Sub 


Private Sub Comando6_Click() 'A fail processing simulation. 
    On Error GoTo ErrManagenent 

    BeginTrans 

    'Some procesing finishin with a Err.Raise 
    ProcessWithError 

    Exit Sub 

ErrManagenent: 

    Debug.Print "Comando6_Click Error: " & Err.Description & "." & vbCrLf & Err.Source 

    Rollback 

End Sub 


Private Sub ProcessWithError() 'simulation of a process ending with error 
    Dim rs As Recordset 
    Dim strSql As String 

    'Any DB query. 
    strSql = "SELECT * FROM 00_Bancos" 
    Set rs = CurrentDb.OpenRecordset(strSql) 

    Debug.Print rs.RecordCount 

    'some processing with 
    '...... 

    'let's suppose there is an error while processing 
    rs.Close 
    Err.Raise 11, , "MY error mesage" 

End Sub 


Private Sub ProcessWithoutError() 'Simulation of a process ending OK 
    Dim rs As Recordset 
    Dim strSql As String 

    'Any DB query. 
    strSql = "SELECT * FROM 00_Bancos" 
    Set rs = CurrentDb.OpenRecordset(strSql) 

    Debug.Print rs.RecordCount 

    'some processing 
    '...... 

    'let's suppose the process finishes OK. 
    rs.Close 

End Sub 

답변

1

당신이/삽입 한 후 롤백에 대한 이해가 여러 SQL 문을 업데이트하는 경우에만 트랜잭션을 사용해야합니다. 또한 SQL 실행 바로 전에 트랜잭션을 사용하고 오류를 트랩하여 어떤 SQL 문이 오류를 트리거하는지 확인하십시오.

의사 :

  • 커밋 또는 롤백 SQL 문을 실행하여 트랜잭션 시작 SQL 문이
  • 을 준비
    1. 유효성 검사를 수행
    2. 준비 SQL 문
    ,

    코드 :

    Private Sub mTrans() 
    
        Dim myDB As DAO.Database 
        Set myDB = CurrentDb 
    
        Dim SQL_SET As String 
        SQL_SET = "First sql statement" 
    
        On Error GoTo ERROR_SQL1: 
        DBEngine.BeginTrans 
         myDB.Execute SQL_SET, dbFailOnError 
         On Error GoTo ERROR_SQL2: 
         SQL_SET = "second sql statement..." 'either use the same variable or use SQL_SET1 for better overview 
         myDB.Execute SQL_SET, dbFailOnError 
        DBEngine.CommitTrans 
    
    EXIT_SUB: 
        On Error Resume Next 
        Set myDB = Nothing 
        Exit Sub 
    ERROR_SQL1: 
        DBEngine.Rollback 
        MsgBox "Error while executing sql_1. " & vbNewLine & "System msg: " & Err.description 
        GoTo EXIT_SUB 
    
    ERROR_SQL2: 
        DBEngine.Rollback 
        MsgBox "Error while executing sql_2. " & vbNewLine & "System msg: " & Err.description 
        GoTo EXIT_SUB 
    End Sub 
    
  • +0

    팁 주셔서 감사합니다. Krish. – Juanfran

    +0

    @ Juanfran 당신은 대답으로 표시 할 수 있으므로 다른 사람들에게 도움이 될 것입니다. –

    +0

    팁 주셔서 감사합니다. Krish. 샘플 코드를 읽은 후 "DBEngine"을 참조하기 위해 코드가 생략되었음을 알았습니다. BeginTrans, CommitTrans 또는 Rollback 메서드 호출 전에. 이제 모든 것이 잘됩니다. – Juanfran

    관련 문제