Dúvida sobre Insert em 3 tabelas com controle de transação - CSharp e SQL Server
16/04/2015
0
Estou desenvolvendo uma aplicação de controle de estoque em 3 camadas (AcesssoDados, Negocios, ObjetoTransferencia e Apresentacao) bem simples pois sou iniciante em C#. Minha base no SQL Server
possui 3 tabelas ()Pesssoa, PessoaFisica e Cliente) juntamente com 3 procedures individuais para dar um insert em cada tabela.
O problema é que quando eu dar um insert no form de cadastro de clientes, ele terá que chamar 3 funções (InserirCliente, InserirPessoaFisica e InserirPessoa) separadamente
de cada classe da camada de negocios e precisava usar um controle de transação no C# para assegurar que o insert será dado nas 3 tabelas e dar um rollback caso ocorra alguma
falha ao inserir em uma das tabelas.
Estou com dificuldades em usar o SqlTransaction pois ele pede conexão e cmd, mas isso fica em outra camada e se eu implementar isso no form
ficará estranho, meio repetido o código e não sei se é o correto...
Postei meu projeto de C# no seguinte link: https://onedrive.live.com/?cid=40838E65B9F8787E&id=40838e65b9f8787e%21120
Alguém sabe como me ajudar a resolver este problema?
Obrigado :)
Jalber Romano
Post mais votado
24/04/2015
Analisei melhor a sua solicitação e ao meu ver tem como fazer isso sim.
Terá que trabalhar com transação no C#
private static void ExecuteSqlTransaction(string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = connection.CreateCommand(); SqlTransaction transaction; // Starta a Transação transaction = connection.BeginTransaction("Exemplo de Transaction"); command.Connection = connection; command.Transaction = transaction; try { command.CommandText = "Stored Procedure 1"; command.ExecuteNonQuery(); command.CommandText = "Stored Procedure 2"; command.ExecuteNonQuery(); command.CommandText = "Stored Procedure 3"; command.ExecuteNonQuery(); // Persistindo os dados no banco transaction.Commit(); } catch (Exception ex) { // Cancelando a transação transaction.Rollback(); } } }
Alisson Santos
Mais Posts
21/04/2015
Alisson Santos
Se não me engano a Store Procedure não existe transação, quando executado a procedure ele já aplica a ação.
Caso queira controlar as transações terá que utilizar o insert fora da procedure.
Agora o que pode fazer é caso tenha algum tipo de erro pode excluir o ultimo registro inserido
22/04/2015
Jalber Romano
05/05/2015
Jalber Romano
Muito boa a sua dica... Era disso que eu precisava...
Que Deus te ilumine sempre.
Muito obrigado! :)
05/05/2015
Jalber Romano
#Classe pessoaBusiness (as outras duas classes estão implementadas iguais)
[img]http://arquivo.devmedia.com.br/forum/imagem/413444-20150505-220930.png[/img]
#Classe FACADE que juntará os Inserts das três classes e que precisa de controle de transação
[img]http://arquivo.devmedia.com.br/forum/imagem/413444-20150505-221143.png[/img]
Preciso controlar a transação dos 3 Inserts na classe ClienteFacade só que eu não estou conseguindo usar a mesma função (command, etc) que as classes das regras de negócio...
Isso que tá pegando...
Clique aqui para fazer login e interagir na Comunidade :)