CONTROLE DE TRANSACAO NO VB6
Prezados,
Preciso de ajuda no controle de transação no vb6 utilizando ADO.
O caso é o seguinte:
Tenho uma rotina que chama varias outras rotina e por sua vez chamam varias outros e por sua vez chamam varias outras que por sua vez fazem alguma ação no base de dados (insert, update ou deletes). Ex.:
private sub importacao()
on erro goto trataerro
...
db.begintrans
call atualizaalgumacoisa [ô]essa rotina chama varias outras, que chamam varias outras
db.committrans
exit sub
trataerro:
db.rollbacktrans
end sub
A pergunta é, como fazer que o commit não seja executado se houver algum erra dentro das rotina chamadas pela rotina [ô]atualizaalgumacoisa[ô]?
Pensei em alterar a rotina ATUALIZAALGUMACOISA para uma função booleana e só dá o commit se retornar true. O problema é que ela chama muitas outras rotina (não função) que podem dar erro. To pensando em precisar alterar o menos possivel o código pra resolver isso.
Alguma sugestão?
Desde já agradeço.
Preciso de ajuda no controle de transação no vb6 utilizando ADO.
O caso é o seguinte:
Tenho uma rotina que chama varias outras rotina e por sua vez chamam varias outros e por sua vez chamam varias outras que por sua vez fazem alguma ação no base de dados (insert, update ou deletes). Ex.:
private sub importacao()
on erro goto trataerro
...
db.begintrans
call atualizaalgumacoisa [ô]essa rotina chama varias outras, que chamam varias outras
db.committrans
exit sub
trataerro:
db.rollbacktrans
end sub
A pergunta é, como fazer que o commit não seja executado se houver algum erra dentro das rotina chamadas pela rotina [ô]atualizaalgumacoisa[ô]?
Pensei em alterar a rotina ATUALIZAALGUMACOISA para uma função booleana e só dá o commit se retornar true. O problema é que ela chama muitas outras rotina (não função) que podem dar erro. To pensando em precisar alterar o menos possivel o código pra resolver isso.
Alguma sugestão?
Desde já agradeço.
Basicamente assim:
inicia a transação
chama uma função principal que chama todas as outras, nessas outras se der erro já da o rollback la e retorna false, essa func principal pode ser boolean
se retornar true
commit
inicia a transação
chama uma função principal que chama todas as outras, nessas outras se der erro já da o rollback la e retorna false, essa func principal pode ser boolean
se retornar true
commit
Obrigado Nilson,
Tbm ja tinha pensado solução que você propos, o problema é que vou precisar alterar muito o código. Mas acho que vai ser esse o jeito mesmo.
Mesmo assim muito obrigado.
Tbm ja tinha pensado solução que você propos, o problema é que vou precisar alterar muito o código. Mas acho que vai ser esse o jeito mesmo.
Mesmo assim muito obrigado.
Se tiver trabalho, mesmo assim vale a pena, uma sequencia de transações mal feitas pode ser fatal.
Tive sérios problemas em um sistema até descobrir que era isso.
Tive sérios problemas em um sistema até descobrir que era isso.
LECCRJ,
Pelo que eu entendi, a solução é simples, basta adicionar em cada uma dessas funções que fazem algumas coisinhas um tratamento de erro e adicionar o Err.Raise, ex:
Na sua Sub principal, você coloca o rollbacktrans assim como você está fazendo e na outras sub[ô]s(Algumas Coisinha) você colocao Raise.
O Raise simplesmente vai retornar o erro para a sub que chamou ela e assim por diante. Então se você pretende chamar 10 sub[ô]s e na 7º sub ocorreu o erro, o erro será retornado para a primeira sub em cascata. Da 7° para 6°, da 6° para 5° e assim por diante até chegar na sua sub principal, no caso a
Obs.: Lembrando que para isso a mesma conexão que você usa na primeira sub, tem que ser usada nas demais sub[ô]s ou function[ô]s.
Pelo que eu entendi, a solução é simples, basta adicionar em cada uma dessas funções que fazem algumas coisinhas um tratamento de erro e adicionar o Err.Raise, ex:
Na sua Sub principal, você coloca o rollbacktrans assim como você está fazendo e na outras sub[ô]s(Algumas Coisinha) você colocao Raise.
Private Sub sGeraBase()
Dim pobjPageSetup As tPageSetup
On Error GoTo TraTaErro
........ [ô]Processos
Exit Sub
TraTaErro:
Err.Raise Err.Number, Err, Err.Description
End Sub
O Raise simplesmente vai retornar o erro para a sub que chamou ela e assim por diante. Então se você pretende chamar 10 sub[ô]s e na 7º sub ocorreu o erro, o erro será retornado para a primeira sub em cascata. Da 7° para 6°, da 6° para 5° e assim por diante até chegar na sua sub principal, no caso a
sub importacao
Obs.: Lembrando que para isso a mesma conexão que você usa na primeira sub, tem que ser usada nas demais sub[ô]s ou function[ô]s.
Uma ideia é não fazer tratativa de erro em nenhum método interno da SUB IMPORTACAO dessa maneira sempre vai retornar no tratamento de erro da sua rotina principal assim o RollBack será executado.
tente false isso!
tente false isso!
Faça seu login para responder