RETORNAR UM INSERT CASO DE ERRO

HORICH 10/07/2013 15:38:48
#425835
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.
TUNUSAT 10/07/2013 15:48:13
#425836
Resposta escolhida
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.
HORICH 10/07/2013 16:01:42
#425837
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
KERPLUNK 10/07/2013 16:18:08
#425838
Use OOP que fica muito mais fácil...
HORICH 10/07/2013 16:30:17
#425839
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.[Ô]
TUNUSAT 10/07/2013 16:39:27
#425840
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.
HORICH 10/07/2013 16:41:32
#425841
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[ô]
Tópico encerrado , respostas não são mais permitidas