none
transacao em classe de acesso a dados RRS feed

  • Pergunta

  • amigos, tenho duas classes, a cliente e a carrosCliente. Como eu faço para chamar o metodo cadastraCliente da classe cliente e o metodo cadastraCarroCliente da classe carrosCliente em uma mesma transação?

    Cada metodo é capas de abrir e fechar a sua propria conexão e eu não queria mudar isso por que em outras parte do meu aplicativo eu vou usar essas classes separadas, por isso elas tem que ser capazes de abrir e fechar a conexão.

    estes metodos estao assim:

    using(Sqlconnection con = new SqlConnection(strConnection))
    {
           SqlCommand cmd = new ....
    }

    se eu estou modelando minhas classes eradas, por favor me digam
    segunda-feira, 26 de outubro de 2009 18:43

Respostas

  • Você tb pode usar transaction scope.

    Da uma Olhada
    http://msdn.microsoft.com/pt-br/library/system.transactions.transactionscope.aspx
    • Sugerido como Resposta Harley Araujo quarta-feira, 28 de outubro de 2009 13:09
    • Marcado como Resposta Harley Araujo quinta-feira, 29 de outubro de 2009 17:06
    segunda-feira, 26 de outubro de 2009 19:00
    Moderador
  • Não. Como cada classe abre sua própria conexão, e ainda mais que você usa o USING (quando ele finaliza  o objeto deixa de existir), creio que não seja possível. Verifique se voce não pode reescrever o codigo do metodo que cria a conexão para que você possa passar um parametro do tipo SQLConnection. Com isso vc pode utilizar a conexão criada dentro de cada metodo ou usar um parametro externo que seria comum as duas classes. Mesmo assim a implementação começa a cheirar a POG.

    Ficaria mais ou menos assim:

    Public class Cliente
    {
    Public void CriaConexao();
    {
          SqlCommand cmd = new ....
    }

    Public void criaConexao(SqlConnection MyConnection);
    {
          SqlCommand cmd =

    }
    }

    Public class carrosCliente
    {
    Public void CriaConexao();
    {
          SqlCommand cmd = new ....
    }

    Public void criaConexao(SqlConnection MyConnection);
    {
          SqlCommand cmd =

    }

    }

    Att

    William
    • Marcado como Resposta Harley Araujo quinta-feira, 29 de outubro de 2009 17:06
    segunda-feira, 26 de outubro de 2009 18:58
    Moderador
  • Nilza,

    Não tem muita saída. Geralmente a transação tem que ser aberta por "fora" das classes, quando uma começa a chamar a outra, ou sair passando transações como parâmetro, o que sempre acaba gerando uma série de problemas... 

    Por essas e outras, eu gosto muito da abordagem da transação como aspecto da aplicação. Esse artiguinho aqui ilustra a idéia: http://ericlemes.wikidot.com/dotnet-spring-pt3

    É baseado na framework Spring.net.


    Abraço,

    Eric
    • Sugerido como Resposta Harley Araujo quarta-feira, 28 de outubro de 2009 13:08
    • Marcado como Resposta Harley Araujo quinta-feira, 29 de outubro de 2009 17:05
    terça-feira, 27 de outubro de 2009 11:17

Todas as Respostas

  • Não. Como cada classe abre sua própria conexão, e ainda mais que você usa o USING (quando ele finaliza  o objeto deixa de existir), creio que não seja possível. Verifique se voce não pode reescrever o codigo do metodo que cria a conexão para que você possa passar um parametro do tipo SQLConnection. Com isso vc pode utilizar a conexão criada dentro de cada metodo ou usar um parametro externo que seria comum as duas classes. Mesmo assim a implementação começa a cheirar a POG.

    Ficaria mais ou menos assim:

    Public class Cliente
    {
    Public void CriaConexao();
    {
          SqlCommand cmd = new ....
    }

    Public void criaConexao(SqlConnection MyConnection);
    {
          SqlCommand cmd =

    }
    }

    Public class carrosCliente
    {
    Public void CriaConexao();
    {
          SqlCommand cmd = new ....
    }

    Public void criaConexao(SqlConnection MyConnection);
    {
          SqlCommand cmd =

    }

    }

    Att

    William
    • Marcado como Resposta Harley Araujo quinta-feira, 29 de outubro de 2009 17:06
    segunda-feira, 26 de outubro de 2009 18:58
    Moderador
  • Você tb pode usar transaction scope.

    Da uma Olhada
    http://msdn.microsoft.com/pt-br/library/system.transactions.transactionscope.aspx
    • Sugerido como Resposta Harley Araujo quarta-feira, 28 de outubro de 2009 13:09
    • Marcado como Resposta Harley Araujo quinta-feira, 29 de outubro de 2009 17:06
    segunda-feira, 26 de outubro de 2009 19:00
    Moderador
  • willian e ai como faço, tipo, tenho esse codigo:

    con.open()
    SqlTransaction transaction = con.BeginTransaction();
    cmd.Transaction = transaction;

    esse trecho cria a transação, mais o que eu passo, o sqlconnection ou o command ? pq veja que a transacao foi adicionada ao comand
    segunda-feira, 26 de outubro de 2009 19:08
  • Oi,

    Uma transação pode ser feita mesmo que os elementos usem conexões distintas. Veja detalhes em http://www.bufaloinfo.com.br/artigos/coluna47.asp

    É importante observar, porém, que o ambiente precisará estar com o MSDTC - Distributed Transaction Coordinator - ativado. Se estiver usando provedores de hospedagem, dificilmente conseguirá.

    []'s
    Dennes
    http://twitter.com/Dennes

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    * Treinamento de ASP.NET 3.5 no RJ dia 16/11 - Apenas 12x R$ 60,48 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp

    Tel : (11) 3170-3056 (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    segunda-feira, 26 de outubro de 2009 20:16
  • Nilza,

    Não tem muita saída. Geralmente a transação tem que ser aberta por "fora" das classes, quando uma começa a chamar a outra, ou sair passando transações como parâmetro, o que sempre acaba gerando uma série de problemas... 

    Por essas e outras, eu gosto muito da abordagem da transação como aspecto da aplicação. Esse artiguinho aqui ilustra a idéia: http://ericlemes.wikidot.com/dotnet-spring-pt3

    É baseado na framework Spring.net.


    Abraço,

    Eric
    • Sugerido como Resposta Harley Araujo quarta-feira, 28 de outubro de 2009 13:08
    • Marcado como Resposta Harley Araujo quinta-feira, 29 de outubro de 2009 17:05
    terça-feira, 27 de outubro de 2009 11:17
  •          Bom dia Nilza.
     

            Tenho um exemplo de conexao que uso no meu sistema e acho  muito bom.

           
       private SqlConnection _conexao = new SqlConnection onfigurationManager.ConnectionStrings["PA"].ConnectionString);
    
        public SqlConnection conexao
        {
            get { return _conexao; }
            set { _conexao = value; }
        }
    
    // sua classe 
     public void AbrirFecharConexao()
        {
            if (conexao.State == ConnectionState.Closed)
            {
                conexao.Open();
            }
            else if (conexao.State == ConnectionState.Open)
            {
                conexao.Close();
            }
        }
    
    SuaClass.AbrirFecharConexao()
    terça-feira, 27 de outubro de 2009 13:11