PROBLEMAS COM BEGIN TRANSACTION, COMMIT E ROLLBACK
o rollback , não funciona, vou postar a classe de conexao e como façõ para usar o begin. commit e rollback, se puderem me dizer onde está o erro!
obrigado desde já
Citação:Public Function Salva_Recibo(ByVal _rec1 As Recibo1, ByVal _rec As List(Of Recibo)) As Boolean
Dim Objdb As New AcessoDados
Dim sSql As String
Try
sSql = [Ô]INSERT INTO recibo1(Procedente, OBS, NUMERO, motivincl) VALUES([ô][Ô] & _rec1.Procedente & [Ô][ô], [ô][Ô] & _rec1.obs & [Ô][ô], [ô][Ô] _
& _rec1.NUMERO & [Ô][ô], [ô][Ô] & _rec1.motivincl & [Ô][ô]);[Ô]
Objdb.BeginTransaction()
Objdb.ExecutaConsulta(sSql)
Dim a
For a = 0 To _rec.Count - 1
sSql = [Ô]INSERT INTO recibo(Id, nome, rg, pai, mae, NUMERO) VALUES([ô][Ô] & _rec.Item(a).Rg & [Ô][ô], [ô][Ô] & _rec.Item(a).nome & [Ô][ô], [ô][Ô] _
& _rec.Item(a).rgoumatr & [Ô][ô], [ô][Ô] & _rec.Item(a).pai & [Ô][ô], [ô][Ô] & _rec.Item(a).mae & [Ô][ô], [ô][Ô] & _rec.Item(a).NUMERO & [Ô][ô]);[Ô]
Objdb.ExecutaConsulta(sSql)
Next
Objdb.CommitTransaction()
Return True
Catch ex As Exception
Objdb.RollBackTransaction()
Objdb.CloseConn()
Throw ex
Return False
End Try
End Function
Isso me fez lembrar do excelente projeto que um colega nosso postou aqui esses dias:
http://www.vbmania.com.br/index.php?modulo=forum&metodo=abrir&id=458959&pagina=1
Tem controle de transações também, talvez você queira dar uma olhada.
Na função que postei para salvar os dados, dou um while no list pra salvar varios dados ao mesmo tempo e se der algum erro, aparece o exception de boa, mas não retorna o banco de dados ao estado original, os registros que foram mandados gravar antes do erro, continuam.
Acho que é falha minha em não saber como realmente funciona o rollback o begin e o commit
Só pra ter certeza sobre a condição do código, faça um teste:
Tenta adicionar os dados de forma que não cause nenhum erro, para dar Commit. Deixa um breakpoint em cima do Commit.
Quando o breakpoint disparar, veja se o banco de dados já foi preenchido (pois, teoricamente, só era pra preencher depois da transação ser concluÃda).
Se o banco não tiver com os dados, ótimo. Sinal que suas instruções estavam dentro da transação. AÃ executa o Commit e verifica. Se tudo funcionar como esperado, menos mal.
Minha desconfiança, é que a transação não esteja acontecendo. Uma vez que tivermos certeza que as instruções estão mesmo em transação, aà vou tentar entender porque o Commit tá funcionando e o Rollback não.
Coloquei um breakpoint no begin e fui seguindo as linhas, não me fez muito sentido a rotina, acho a a classe AcessoDados deve estar incompleta ou com falhas graves rsrsrs
Tentar fazer mais testes:
1 - Coloque um breakpoint nessa linha e verifique o valor que o [Ô]trans[Ô] tá retornando;
trans = conn.BeginTransaction()
2 - No ExecutaConsulta, verifica se o valor da transação está indo com o valor, nessa linha:
cmd.Transaction = trans
Aparentemente, está tudo correto... só se tiver alguma mudança de variável que não me atentei...