Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 517719
            [titulo] => Dúvida sobre Insert em 3 tabelas com controle de transação - CSharp e SQL Server
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-04-24 09:04:03
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 250291
            [status] => M
            [isExample] => 
            [NomeUsuario] => Alisson Santos
            [Apelido] => Alisson
            [Foto] => P3290249-2.JPG
            [Conteudo] => 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#

[code]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();
}
}
}[/code] ) )

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

Jalber Romano
   - 16 abr 2015

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 :)

Post mais votado

Alisson
|
MVP
Pontos: 3400
    24 abr 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#

#Código

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();
        }
    }
}

1
|
0

Alisson
|
MVP
Pontos: 3400
    21 abr 2015

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

Jalber Romano
   - 22 abr 2015

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

Jalber Romano
   - 05 mai 2015

Obrigado Alisson pela ajuda!!

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

Que Deus te ilumine sempre.
Muito obrigado! :)

Jalber Romano
   - 05 mai 2015

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)
Clique na imagem para abrir em uma nova janela

#Classe FACADE que juntará os Inserts das três classes e que precisa de controle de transação
Clique na imagem para abrir em uma nova janela

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