none
Transaction RRS feed

  • Pergunta

  •  

    Galera estou precisando resolver um problemão, mas eu nao tenho muita afinidade com transaction.

     

    Bom meu cenario é o seguinte!

     

    Tenho um enorme cadastro em um unico formulario em ASP.NET,

    esse formulario esta divido em quatro area: usuario, dados pessoais, endereço, contato.

     

    para cada area eu tenho uma classe com seu respectivos metodos: ou seja por ex a classe usuario com seu metodos insert, delete, update e select.

     

    O que eu gostaria de fazer é criar uma transação para esse formulario, pois eu quero que quando acontecer algum erro ou problemas externos no momento do cadastro, não quero q seja efetivado os cadastro q foram feito ate o momento do problema.

     

    mas como fazer isso se tenho classes distintas para cada area do cadastro?

     

    ou seja no final de tudo eu clicar no botao (finalizar) e o mesmo dar um comit em tudo ou um rollback se não for aprovado ou ocorrer um erro.

     

    Ficon no aguardo

     

    Fabio

    quarta-feira, 5 de setembro de 2007 19:59

Todas as Respostas

  • bool IsConsistent = false;

    using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())

    {

          SqlConnection cn = newSqlConnection(CONNECTION_STRING );

          string sql = "DELETE Categories";

          SqlCommand cmd = newSqlCommand(sql, cn);

          cn.Open();

          cmd.ExecuteNonQuery();

          cn.Close();

          //Based on this property the transaction will commit if

          //successful.  If it fails however, this property will

          //not be set and the transaction will not commit.

          ts.Consistent = IsConsistent;

    }



    bool IsConsistent = false;

    using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())

    {

         SqlConnection cn = newSqlConnection(CONNECTION_STRING );

         string sql = "DELETE Categories";

         SqlCommand cmd = newSqlCommand(sql, cn);

         cn.Open();

         try

         {

              cmd.ExecuteNonQuery();

              IsConsistent = true;

         }

         catch (SqlException ex)

         {

             //You can specify additional error handling here

         }

         cn.Close();

         //Again, since this was set to false originally it will only

         //commit if it worked.

         ts.Consistent = IsConsitent;

    }



    bool IsConsistent = false;

    using (TransactionScope ts = newTransactionScope())

    {

      using (SqlConnection cn = newSqlConnection(YUKON_CONNECTION_STRING))

      {

        string sql = "DELETE Products";

        SqlCommand cmd = newSqlCommand(sql, cn);

        cn.Open();

        try

        {

           cmd.ExecuteNonQuery();

           using(SqlConnection cnn = newSqlConnection(CONNECTION_STRING))

           {

                string sql_2 = "DELETE Categories";

                SqlCommand cmd2 = newSqlCommand(sql_2, cnn);

                cnn.Open();

                cmd.ExecuteNonQuery();

                cnn.Close();

           }

               IsConsistent = true;

         }

         catch (SqlException ex)

         {

            //You can specify additional error handling here

         }

         cn.Close();

      }

      ts.Consistent = IsConsistent;

    }


    privatebool OldSchool()

    {

      bool IsConsistent = false;

      ICommittableTransaction oldSchoolTrans = Transaction.Create();

      using (SqlConnection cn = newSqlConnection(CONNECTION_STRING))

      {

                    string sql = "DELETE Categories";

                    SqlCommand cmd = newSqlCommand(sql, cn);

                    cn.Open();

                    cn.EnlistTransaction((ITransaction)oldSchoolTrans);

                    try

                    {

                        cmd.ExecuteNonQuery();

                        IsConsistent = true;

                        returntrue;

                    }

                    catch (SqlException ex)

                    {

                        //You can specify additional error handling here

                        //This is where you’d rollback your transaction

                        return (ex.ToString().Length < 1);

                    }

                    cn.Close();

          }

      }


    da uma olhada nesse link tb  http://www.macoratti.net/adn_tran.htm


    Boa sorte!!



    quarta-feira, 5 de setembro de 2007 20:47
  • Ola Fabio,

    A solução poderia ser utilizar, ou melhor, envolver o bloco sujeito a falhas dentro do TransactionScope como você já deve saber.

    Uma saída poderia ser utilizar o atributo Transaction da diretiva @Page, como é mostrado aqui: http://samples.gotdotnet.com/quickstart/aspplus/doc/mtstransactions.aspx

    quinta-feira, 6 de setembro de 2007 11:38
  • Ola Henry,

    IsConsistent era uma propriedade ainda quando o System.Transactions.dll era Beta. Atualmente ela não existe mais e para votar como sucesso ou falha na transação, chame ou não o método Complete da classe TransactionScope.

     

    quinta-feira, 6 de setembro de 2007 11:40
  • Valeu Rapaziada, vou dar uma olhada aqui..qualquer duvida eu volto aqui...

     

    quinta-feira, 6 de setembro de 2007 13:20
  • Ok Israel, vou da uma olhada obrigado!!

     

    Abraços!!

    sexta-feira, 7 de setembro de 2007 10:14