none
RollBack RRS feed

  • Pergunta

  • Bom dia o método incluir abaixo inclui registro por registro, minha dúvida é se eu receber 100 registros  e ocorrer um erro eu consigo fazer um RollBack de tudo?
    
    <br/>
    
                MensagemConcorrentes mensagemConcorrentes = new MensagemConcorrentes();
                DatabaseHelper db;
                using (db = new DatabaseHelper())
                {
                    try
                    {
                        foreach (var concorrente in concorrentes)
                        {
                            db.AddParameter("@CodigoSap", concorrente.CodigoSap);
                            db.AddParameter("@ConcorrenteDescricao", concorrente.ConcorrenteDescricao);
                            db.AddParameter("@UsuarioSap", concorrente.UsuarioSap);
                            db.AddParameter("@Ativo", concorrente.Ativo ?? "0");
                            db.BeginTransaction();
                            db.ExecuteNonQuery("CadastrarConcorrentes", CommandType.StoredProcedure, Framework.ConnectionState.KeepOpen);
                            db.CommitTransaction();
                        }
    
                        mensagemConcorrentes.Mensagem = concorrentes.Count == 1 ?
                                                                                    string.Format("CONCORRENTE CRIADO COM SUCESSO - CODIGO SAP - {0}", concorrentes[0].CodigoSap)
                                                            : "CONCORRENTES CADASTRADOS COM SUCESSO";
    
                        mensagemConcorrentes.Status = "S";
                    }
                    catch (Exception ex)
                    {
                        db.RollbackTransaction();
                        mensagemConcorrentes.Mensagem = ex.Message;
                        mensagemConcorrentes.Status = "E";
                        return mensagemConcorrentes;
                    }
                }
                return mensagemConcorrentes;
            }
    
    <pre lang="x-sql">ALTER PROCEDURE [dbo].[CadastrarConcorrentes]
    (
    @CodigoSap NVARCHAR(40),
    @ConcorrenteDescricao NVARCHAR(150),
    @UsuarioSap NVARCHAR(50),
    @Ativo CHAR(1)
    
    )
    AS
    
    BEGIN
    
    	IF EXISTS(SELECT ConcorrenteId FROM Concorrentes WHERE CodigoSap = @CodigoSap)
    						BEGIN
    							UPDATE Concorrentes SET CodigoSap = @CodigoSap, ConcorrenteDescricao = @ConcorrenteDescricao, 
    							UsuarioSap = @UsuarioSap, Modificacao = 'A', DataAlteracao = GetDate(), 
    							UsuarioSapAlteracao = @UsuarioSap, Ativo = @Ativo
    							WHERE CodigoSap = @CodigoSap														
    						END
    				ELSE
    						BEGIN
    							INSERT INTO  Concorrentes(CodigoSap, ConcorrenteDescricao, UsuarioSap, DataCriacao, Modificacao, Ativo)
    							VALUES     (@CodigoSap,@ConcorrenteDescricao,@UsuarioSap, GetDate(), 'I', @Ativo)														
    					    END		
    END
    





    Fabio Galante Mans - www.mans.com.br
    • Movido Gustavo Maia Aguiar sexta-feira, 25 de novembro de 2011 16:24 (De:SQL Server - Desenvolvimento Geral)
    sexta-feira, 25 de novembro de 2011 12:51

Respostas

  • Fábio,

    Eu imagino que você esteja trabalhando com Linq To SQL ai em cima e por isto indiquei os links.

    Caso não esteja, pode utilizar aquele classe SQLHelper que você conhece e fazer algo assim:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace CA_CSharp
    {
        public class PESSOA
        {
            public int CODIGO { get; set; }
            public string NOME {get;set;}
            public string EMAIL {get;set;}
        }
    }
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace CA_CSharp
    {
        public class PessoaHelper
        {
            private SqlConnection m_Connection;
    
            public SqlConnection Connection
            {
                get { return m_Connection; }
                set { m_Connection = value; }
            }
            private SqlTransaction m_transaction;
    
            public SqlTransaction Transaction
            {
                get { return m_transaction; }
                set { m_transaction = value; }
            }
    
            public PessoaHelper() { }
    
            public PessoaHelper(SqlConnection connection)
            {
                this.m_Connection = connection;
            }
            public PessoaHelper(SqlConnection connection, SqlTransaction transaction)
            {
                this.m_Connection = connection;
                this.m_transaction = transaction;
            }        
            
            
            public void Cadastrar(PESSOA dados)
            {          
                try
                {
                    SqlCommand cmd = InsertCommandPessoa();
                    cmd.CommandType = CommandType.StoredProcedure;
    
                    cmd.Parameters["@Nome"].Value = dados.NOME;
                    cmd.Parameters["@Email"].Value = dados.EMAIL;
                    
                    cmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {                
                    throw;
                }
    
            }
    
            private SqlCommand InsertCommandPessoa()
            {
                const string commandText = "spu_InsertPessoa";
    
                SqlParameter[] parameters = SqlHelperParameterCache.GetCachedParameterSet(this.m_Connection.ConnectionString, commandText);
    
                if ((parameters == null))
                {
                    parameters = new SqlParameter[2];
                    parameters[0] = new SqlParameter("@Nome", SqlDbType.VarChar, 50, "Nome");
                    parameters[1] = new SqlParameter("@Email", SqlDbType.VarChar, 50, "Email");
    
                    SqlHelperParameterCache.CacheParameterSet(this.m_Connection.ConnectionString, commandText, parameters);
                }
    
                SqlCommand command = new SqlCommand(commandText, this.m_Connection);
    
                var _with1 = command;
                _with1.Transaction = this.m_transaction;
                _with1.CommandType = CommandType.StoredProcedure;
    
                SqlHelper.AttachParameters(command, parameters);
    
                return command; 
            }
        }
    }
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    
    namespace CA_CSharp
    {
        public class PessoaBRL
        {
            public void Cadastrar(List<PESSOA> dados)
            {
                PessoaHelper pessoaHelper = null;
                SqlConnection connection = null;
                SqlTransaction transaction = null;
    
                try
                {
                    connection = SqlHelper.CreateConnection();
                    pessoaHelper = new PessoaHelper(connection);
    
                    connection.Open();
    
                    transaction = connection.BeginTransaction();
    
                    pessoaHelper.Transaction = transaction;
    
    
                    foreach (PESSOA p in dados)
                    {
                        pessoaHelper.Cadastrar(p);
                    }
    
                    transaction.Commit();
    
                }
                catch (Exception )
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    transaction.Dispose();
                }
            }
        }
    }
    
    

    using System;
    using System.Data;
    using System.Text;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    
    namespace CA_CSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<PESSOA> lstPessoa = new List<PESSOA>();
                lstPessoa.Add(new PESSOA() { NOME = "Paulo", EMAIL = "p@teste.com" });
                lstPessoa.Add(new PESSOA() { NOME = "Carlos", EMAIL = "c@teste.com" });
                lstPessoa.Add(new PESSOA() { NOME = "Fabio", EMAIL = "f@teste.com" });
    
                try
                {
                    PessoaBRL pessoaBRL = new PessoaBRL();
                    pessoaBRL.Cadastrar(lstPessoa);
    
                    Console.WriteLine("Cadastro realizado com sucesso.");
                
    
                }
                catch (Exception e)
                {
                    Console.WriteLine("Erro: {0}", e.Message );
                }
                
                Console.ReadKey();            
            }
           
        }
    }
    
    


     

     

     


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    domingo, 27 de novembro de 2011 00:56

Todas as Respostas

  • Boa Tarde,

    Considerando que cada chamada abre sua própria transação, não será possível desfazer tudo. Se há essa necessidade você pode efetuá-la de duas formas:

    - Abra uma transação externa que englobe todas as chamadas e ao final efetive-a (senão houver erros)
    - Tente montar sua lógica para inserir em bloco e não registro a registro

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 25 de novembro de 2011 16:24
  • Você tem um exemplo de como incluir em bloco?

    Obrigado.

     


    Fabio Galante Mans - www.mans.com.br
    sexta-feira, 25 de novembro de 2011 17:08
  • Fabio,

    Veja se resolve: http://chiragrdarji.wordpress.com/2007/08/25/how-to-use-transaction-in-linq-using-c/

    Eu gosto de usar a classe TransactionScope:

    http://www.west-wind.com/weblog/posts/2009/Jul/14/LINQ-to-SQL-and-Transactions


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    sábado, 26 de novembro de 2011 23:25
  • Fábio,

    Eu imagino que você esteja trabalhando com Linq To SQL ai em cima e por isto indiquei os links.

    Caso não esteja, pode utilizar aquele classe SQLHelper que você conhece e fazer algo assim:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace CA_CSharp
    {
        public class PESSOA
        {
            public int CODIGO { get; set; }
            public string NOME {get;set;}
            public string EMAIL {get;set;}
        }
    }
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace CA_CSharp
    {
        public class PessoaHelper
        {
            private SqlConnection m_Connection;
    
            public SqlConnection Connection
            {
                get { return m_Connection; }
                set { m_Connection = value; }
            }
            private SqlTransaction m_transaction;
    
            public SqlTransaction Transaction
            {
                get { return m_transaction; }
                set { m_transaction = value; }
            }
    
            public PessoaHelper() { }
    
            public PessoaHelper(SqlConnection connection)
            {
                this.m_Connection = connection;
            }
            public PessoaHelper(SqlConnection connection, SqlTransaction transaction)
            {
                this.m_Connection = connection;
                this.m_transaction = transaction;
            }        
            
            
            public void Cadastrar(PESSOA dados)
            {          
                try
                {
                    SqlCommand cmd = InsertCommandPessoa();
                    cmd.CommandType = CommandType.StoredProcedure;
    
                    cmd.Parameters["@Nome"].Value = dados.NOME;
                    cmd.Parameters["@Email"].Value = dados.EMAIL;
                    
                    cmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {                
                    throw;
                }
    
            }
    
            private SqlCommand InsertCommandPessoa()
            {
                const string commandText = "spu_InsertPessoa";
    
                SqlParameter[] parameters = SqlHelperParameterCache.GetCachedParameterSet(this.m_Connection.ConnectionString, commandText);
    
                if ((parameters == null))
                {
                    parameters = new SqlParameter[2];
                    parameters[0] = new SqlParameter("@Nome", SqlDbType.VarChar, 50, "Nome");
                    parameters[1] = new SqlParameter("@Email", SqlDbType.VarChar, 50, "Email");
    
                    SqlHelperParameterCache.CacheParameterSet(this.m_Connection.ConnectionString, commandText, parameters);
                }
    
                SqlCommand command = new SqlCommand(commandText, this.m_Connection);
    
                var _with1 = command;
                _with1.Transaction = this.m_transaction;
                _with1.CommandType = CommandType.StoredProcedure;
    
                SqlHelper.AttachParameters(command, parameters);
    
                return command; 
            }
        }
    }
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    
    namespace CA_CSharp
    {
        public class PessoaBRL
        {
            public void Cadastrar(List<PESSOA> dados)
            {
                PessoaHelper pessoaHelper = null;
                SqlConnection connection = null;
                SqlTransaction transaction = null;
    
                try
                {
                    connection = SqlHelper.CreateConnection();
                    pessoaHelper = new PessoaHelper(connection);
    
                    connection.Open();
    
                    transaction = connection.BeginTransaction();
    
                    pessoaHelper.Transaction = transaction;
    
    
                    foreach (PESSOA p in dados)
                    {
                        pessoaHelper.Cadastrar(p);
                    }
    
                    transaction.Commit();
    
                }
                catch (Exception )
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    transaction.Dispose();
                }
            }
        }
    }
    
    

    using System;
    using System.Data;
    using System.Text;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    
    namespace CA_CSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<PESSOA> lstPessoa = new List<PESSOA>();
                lstPessoa.Add(new PESSOA() { NOME = "Paulo", EMAIL = "p@teste.com" });
                lstPessoa.Add(new PESSOA() { NOME = "Carlos", EMAIL = "c@teste.com" });
                lstPessoa.Add(new PESSOA() { NOME = "Fabio", EMAIL = "f@teste.com" });
    
                try
                {
                    PessoaBRL pessoaBRL = new PessoaBRL();
                    pessoaBRL.Cadastrar(lstPessoa);
    
                    Console.WriteLine("Cadastro realizado com sucesso.");
                
    
                }
                catch (Exception e)
                {
                    Console.WriteLine("Erro: {0}", e.Message );
                }
                
                Console.ReadKey();            
            }
           
        }
    }
    
    


     

     

     


    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    domingo, 27 de novembro de 2011 00:56
  • Coloque o db.BeginTransaction() antes do ForEach, e o db.CommitTransaction após o for.

    Isso ja vai fazer o teu insert ser executado em bloco.


    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 29 de novembro de 2011 02:52
  • Coloque o db.BeginTransaction() antes do ForEach, e o db.CommitTransaction após o for.

    Isso ja vai fazer o teu insert ser executado em bloco.


    Quem sabe um dia os DataSets se extinguirão?
    Com certeza vai funcionar!!! Eu imagino que não foi possível chamar o BeginTransaction por algum motivo.... hehehe

    --
    Marque as respostas e ajude a melhorar a busca do fórum.
    terça-feira, 29 de novembro de 2011 11:33
  • Nada Fábio?

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    sexta-feira, 17 de fevereiro de 2012 18:40