Usuário com melhor resposta
RollBack

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)
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.- Sugerido como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator domingo, 27 de novembro de 2011 12:37
- Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator sábado, 18 de fevereiro de 2012 12:19
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 -
-
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. -
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.- Sugerido como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator domingo, 27 de novembro de 2011 12:37
- Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator sábado, 18 de fevereiro de 2012 12:19
-
-
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?
--
Marque as respostas e ajude a melhorar a busca do fórum. -