RETORNAR UM INSERT CASO DE ERRO
Eu tenho uma rotina de Inserts em VB.Net
Try
CadastraCliente()
CadastraEndereços()
CadastraContatos()
Catch ex As Exception
MessageBox.Show(ex.Message, [Ô]Atenção![Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
End try
Exemplo, tenho essas 3 rotinas cada uma faz um insert em uma tabela diferente, teria como fazer ele voltar exemplo dar um [Ô]Rollback[Ô] caso de um erro em uma das três rotinas para não salvar nada? Para não ficar metade de um cadastro só no banco de dados.
Try
CadastraCliente()
CadastraEndereços()
CadastraContatos()
Catch ex As Exception
MessageBox.Show(ex.Message, [Ô]Atenção![Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
End try
Exemplo, tenho essas 3 rotinas cada uma faz um insert em uma tabela diferente, teria como fazer ele voltar exemplo dar um [Ô]Rollback[Ô] caso de um erro em uma das três rotinas para não salvar nada? Para não ficar metade de um cadastro só no banco de dados.
Horich,
Tem como sim.
A ADO.NET fornece os seguintes métodos correspondentes no objeto SqlTransaction : BeginTransaction, CommitTransaction e RollBackTransaction.
http://www.macoratti.net/vbn5_trt.htm
Você pode até indicar em qual posição deu erro para ficar mais fácil de corrigir depois.
[][ô]s,
Tunusat.
Tem como sim.
A ADO.NET fornece os seguintes métodos correspondentes no objeto SqlTransaction : BeginTransaction, CommitTransaction e RollBackTransaction.
http://www.macoratti.net/vbn5_trt.htm
Você pode até indicar em qual posição deu erro para ficar mais fácil de corrigir depois.
[][ô]s,
Tunusat.
Citação::
Horich,
Tem como sim.
A ADO.NET fornece os seguintes métodos correspondentes no objeto SqlTransaction : BeginTransaction, CommitTransaction e RollBackTransaction.
http://www.macoratti.net/vbn5_trt.htm
Você pode até indicar em qual posição deu erro para ficar mais fácil de corrigir depois.
[][ô]s,
Tunusat.
Cara Você salvou minha vida eu tava dando uma olhada no site do Macoratti não tinha achado nada, mais isso é igualzinho o que eu usava antes Obg Mesmo
Use OOP que fica muito mais fácil...
TUNUSAT Eu montei o Begin e o Commit assim:
Dim trans As SqlTransaction
trans = conec.BeginTransaction
If CadastraCliente() = False then
trans.RollBack()
end if
If CadastraEndereços() = False then
trans.RollBack()
end if
if CadastraContatos() = False then
trans.RollBack()
end if
trans.Commit()
Dentro destes 3 Insert[ô]s tem 2 Select[ô]s, isso seria um problema ainda ?
Ele Gerou o erro:
[Ô]ExecuteReader requer que o comando tenha uma transação quando a conexão atribuÃda ao comando estiver em uma transação local pendente. A propriedade Transaction do comando não foi inicializada.[Ô]
Dim trans As SqlTransaction
trans = conec.BeginTransaction
If CadastraCliente() = False then
trans.RollBack()
end if
If CadastraEndereços() = False then
trans.RollBack()
end if
if CadastraContatos() = False then
trans.RollBack()
end if
trans.Commit()
Dentro destes 3 Insert[ô]s tem 2 Select[ô]s, isso seria um problema ainda ?
Ele Gerou o erro:
[Ô]ExecuteReader requer que o comando tenha uma transação quando a conexão atribuÃda ao comando estiver em uma transação local pendente. A propriedade Transaction do comando não foi inicializada.[Ô]
Horich,
Não acredito que select sejam um problema, a não ser que a base de dados caia ou a rede caia e você tem que gerenciar isto também.
Acho que você pode mudar para uma linha só se quiser... e nem precisa da comparação também:
Exemplo:
If Not CadastraCliente() then trans.RollBack()
Mas minha idéia era de retornar um erro personalizado para colocar no tratamento de excessões (Try ... Catch). Desta forma poderia fazer um [Ô]log[Ô] de erros ou mandar uma mensagem personalizada ao usuário sobre o ponto exato onde deu o erro.
Somente dentro do tratamento de excessões você colocaria o [Ô]RollBack()[Ô]. (1 linha só).
[][ô]s,
Tunusat.
Não acredito que select sejam um problema, a não ser que a base de dados caia ou a rede caia e você tem que gerenciar isto também.
Acho que você pode mudar para uma linha só se quiser... e nem precisa da comparação também:
Exemplo:
If Not CadastraCliente() then trans.RollBack()
Mas minha idéia era de retornar um erro personalizado para colocar no tratamento de excessões (Try ... Catch). Desta forma poderia fazer um [Ô]log[Ô] de erros ou mandar uma mensagem personalizada ao usuário sobre o ponto exato onde deu o erro.
Somente dentro do tratamento de excessões você colocaria o [Ô]RollBack()[Ô]. (1 linha só).
[][ô]s,
Tunusat.
Esquece, Mancada Minha esqueci de alterar em duas Query's o tipo dela
Ex.
Dim comando As New SqlClient.SqlCommand(SQL2, oSQLConn, query)
Quando faz um Begin e Commit tem que colocar na [ô]Lista[ô]
Ex.
Dim comando As New SqlClient.SqlCommand(SQL2, oSQLConn, query)
Quando faz um Begin e Commit tem que colocar na [ô]Lista[ô]
Tópico encerrado , respostas não são mais permitidas