none
try catch RRS feed

  • Pergunta

  • Olá a todos,

    Tenho um método que atualiza dados no banco de dados.
    eu utilizo o try catch normalmente.
    o problema é que, quando dá um erro na gravação eu quero dar um "rollback" para desfazer as alterações.
    Como eu faço isso?

    Grade abraço.

    João Luiz
    segunda-feira, 1 de março de 2010 17:16

Respostas

  • Olá joão...

     

    Try
    Seu codigo

    trans.Commit()

    Catch

     

     

    ex As Exception
       If Not IsNothing(trans) Then
       trans.Rollback()
       End If
    Finally
       If SQLConnection1.State = ConnectionState.Open Then
       SQLConnection1.Close()
       End If
    End Try


    Att, Ednaldo Soares Garcia Programador .NET Sistemas Windows / WEB Acesse: www.ednaldosoares.com Frase: Honestidade, Humildade e Perseverança acima de tudo!!!
    • Sugerido como Resposta henri nusbaum segunda-feira, 1 de março de 2010 18:22
    • Marcado como Resposta Harley Araujo quarta-feira, 3 de março de 2010 13:16
    segunda-feira, 1 de março de 2010 17:19
  • Quando que dá essa exception no modo debug?

    Eu faria de outra maneira para não dar problema se ocorrer uma exception antes de criar a transação:

                Conexao = new SqlConnection(StrConexao.ConnectionString);
                Conexao.Open();
                Comando = new SqlCommand("UPDATE Laudos SET pressaoContratada = " + pressaocontratadastr + ", medidorNumeroSerie = '" + numeroserie.Text + "' WHERE IDLaudo = " + laudo.SelectedValue, Conexao);
                
                SqlCommand command = Conexao.CreateCommand();
                SqlTransaction transaction;
    
                transaction = Conexao.BeginTransaction();
    
                command.Connection = Conexao;
                command.Transaction = transaction;
    
                
                try
                {
                    Comando.ExecuteNonQuery();
                    transaction.Commit();
                }
                catch
                {
                    if(transaction != null)
                        transaction.Rollback();
                }
                finally
                {
                    Conexao.Close();
                }
    
    

    Henri Nusbaum - Itelios do Brasil Informática Ltda
    • Marcado como Resposta Harley Araujo quarta-feira, 3 de março de 2010 13:16
    segunda-feira, 1 de março de 2010 18:46

Todas as Respostas

  • Olá joão...

     

    Try
    Seu codigo

    trans.Commit()

    Catch

     

     

    ex As Exception
       If Not IsNothing(trans) Then
       trans.Rollback()
       End If
    Finally
       If SQLConnection1.State = ConnectionState.Open Then
       SQLConnection1.Close()
       End If
    End Try


    Att, Ednaldo Soares Garcia Programador .NET Sistemas Windows / WEB Acesse: www.ednaldosoares.com Frase: Honestidade, Humildade e Perseverança acima de tudo!!!
    • Sugerido como Resposta henri nusbaum segunda-feira, 1 de março de 2010 18:22
    • Marcado como Resposta Harley Araujo quarta-feira, 3 de março de 2010 13:16
    segunda-feira, 1 de março de 2010 17:19
  • de onde vem o objeto trans?

    não está declarado ou instanciado.

    o código não reconhece.
    segunda-feira, 1 de março de 2010 17:52
  • Olá,
    trans pelo que percebi é um objeto da class SqlCommand.
    Nele você têm a propriedade Transaction e o método RollBack() e diversos outros.

    SqlCommand cmd = new SqlCommand();
    cmd.Transaction.RollBack();

    Espero ter ajudado.

    Felipe K. de Mello
    Web Developer
    Visite meu site: felipekm.com

    MCP Web-Based Client Development
    segunda-feira, 1 de março de 2010 18:16
  • Completando a resposta do Ednaldo:

    use o método BeginTransaction do objeto connection. E depois precisa adicionar o SqlTransaction no SqlCommand

            SqlCommand command = connection.CreateCommand();
            SqlTransaction transaction;
    
            transaction = connection.BeginTransaction();
    
            command.Connection = connection;
            command.Transaction = transaction;
    
    Eu peguei o código daqui: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx

    Henri Nusbaum - Itelios do Brasil Informática Ltda
    segunda-feira, 1 de março de 2010 18:21
  • No modo debug diz que não existe instancia de objeto válido.

    eu tenho que criar outro comando para fazer isso?

    Conexao = new SqlConnection(StrConexao.ConnectionString);
                Conexao.Open();
                Comando = new SqlCommand("UPDATE Laudos SET pressaoContratada = " + pressaocontratadastr + ", medidorNumeroSerie = '" + numeroserie.Text + "' WHERE IDLaudo = " + laudo.SelectedValue, Conexao);
                
                SqlCommand command = Conexao.CreateCommand();
                SqlTransaction transaction;
    
                transaction = Conexao.BeginTransaction();
    
                command.Connection = Conexao;
                command.Transaction = transaction;
    
                
                try
                {
                    Comando.ExecuteNonQuery();
                    Comando.Transaction.Commit();
                }
                catch
                {
                    Comando.Transaction.Rollback();
                }
                finally
                {
                    Conexao.Close();
                }

    segunda-feira, 1 de março de 2010 18:34
  • Quando que dá essa exception no modo debug?

    Eu faria de outra maneira para não dar problema se ocorrer uma exception antes de criar a transação:

                Conexao = new SqlConnection(StrConexao.ConnectionString);
                Conexao.Open();
                Comando = new SqlCommand("UPDATE Laudos SET pressaoContratada = " + pressaocontratadastr + ", medidorNumeroSerie = '" + numeroserie.Text + "' WHERE IDLaudo = " + laudo.SelectedValue, Conexao);
                
                SqlCommand command = Conexao.CreateCommand();
                SqlTransaction transaction;
    
                transaction = Conexao.BeginTransaction();
    
                command.Connection = Conexao;
                command.Transaction = transaction;
    
                
                try
                {
                    Comando.ExecuteNonQuery();
                    transaction.Commit();
                }
                catch
                {
                    if(transaction != null)
                        transaction.Rollback();
                }
                finally
                {
                    Conexao.Close();
                }
    
    

    Henri Nusbaum - Itelios do Brasil Informática Ltda
    • Marcado como Resposta Harley Araujo quarta-feira, 3 de março de 2010 13:16
    segunda-feira, 1 de março de 2010 18:46