| |
한가지 더 소개 하겠습니다..
오랜만에 좋은 질문이 올라와서.. ^^;
언바운드 폼을 많이 사용하거나 다른 툴로 개발할 때 ADO를 이용하여 연결하거나 (mdb폼이나 vb, excel, 파워빌더, 델파이 등)
트랜잭션 처리 코드가 많다면 아래처럼 클래스 모듈을 이용하여 Connection 개체의 이벤트를 사용하여 보십시요..
다만.. 어차피 Connection개체는 하나만 만들면 되니까 굳이 클래스 모듈을 사용할 필요는 없고 (언바운드 폼이 많거나 트랜잭션 처리 코드가 많다면 사용할만 하구요..) 폼의 모듈을 사용해도 되겠지요.. 폼 모듈도 클래스 모듈이니까..
일단 몇가지 장치를 해두어야 합니다.. 하기는 번거롭지만 해두면 편리하지요..
Public WithEvents Cnn As ADODB.Connection
Dim flgErrorOccured As Boolean
Private Sub Form_Open(Cancel As Integer)
IF Cnn Is Nothing then '다른 폼에서 열어 두었을 수도 있으니까..
Set Cnn = CurrentProject.Connection
end if
End Sub
Private Sub Form_Close()
Cnn.Close
Set Cnn = Nothing
End Sub
Private Sub Cnn_ExecuteComplete(ByVal RecordsAffected As Long _
, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum _
, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset _
, ByVal pConnection As ADODB.Connection)
If adStatus = adStatusErrorsOccurred Then
flgErrorOccured = True
End If
End Sub
Private Sub Cnn_BeginTransComplete(ByVal TransactionLevel As Long _
, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum _
, ByVal pConnection As ADODB.Connection)
flgErrorOccured = False
End Sub
Private Sub CompleteTrans() '★
if flgErrorOccured then
Cnn.RollbackTrans
Else
Cnn.CommitTrans
End if
End Sub
''자.. 이제 예의 트랜잭션 사용 프로시저 입니다..
If MsgBox("현재 등록내용을 확정하여 보내시겠습니까? (이후 수정 불가)", vbYesNo + vbQuestion, "등록내용확정송부") = vbYes Then
Cnn.BeginTrans '★
Cnn.Excute "INSERT INTO dbo.Result_All (Jumpo, Year, Quarter~~~~;
Cnn.Excute "Delete FROM dbo.Result where UserID = '" & myId & "'")
'Cnn.Excute가 몇개가 오든 상관 없습니다..
'위 아래 별표사이의 SQL 중 하나라도 에러가 나면 롤백 됩니다.
CompleteTrans '★
Else
Cancel = True
End If
사용시 코드가 훨씬 간단해 졌습니다..
트랜잭션을 여러군데 사용한다면 편리할 겁니다.. ^^ |
|