Dúvida sobre Insert em 3 tabelas com controle de transação - CSharp e SQL Server

16/04/2015

0

Olá amigos do Fórum.

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

Jalber Romano

Responder

Post mais votado

24/04/2015

Jalber bom dia.

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

Alisson Santos
Responder

Mais Posts

21/04/2015

Alisson Santos

Boa noite Jalber.

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
Responder

22/04/2015

Jalber Romano

Olá Alisson... Tem como sim... o problema é que tenho 3 classes no C# que contêm 3 funções Inserir() que mandarão para 3 SP que precisam efetivar, mas será ecessário controlar muito bem a transação pois se grava em uma e nas outras der erro vai dar problema...
Responder

05/05/2015

Jalber Romano

Obrigado Alisson pela ajuda!!

Muito boa a sua dica... Era disso que eu precisava...

Que Deus te ilumine sempre.
Muito obrigado! :)
Responder

05/05/2015

Jalber Romano

Alisson, surgiu uma nova dúvida... é que eu implementei uma classe FACADE para poder unir os métodos Inserir() das classes PessoaBusiness, PessoaFisicaBusiness e ClienteBusiness. Observe:

#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...
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar