none
[ADO.NET] Problemas com múltiplos DataReader! RRS feed

  • Pergunta

  • Olá, pessoal do MSDN!

    Tudo bem?

    Bom, estou desenvolvendo uma aplicação para uso pessoal aqui, mas surgiu um pequeno problema com relação ao uso de diversos DataReader:

    Eu tenho minha classe DAO, que faz a leitura de algumas situações:

    public class SituacaoDAO : InterfaceDAO<Situacao>
    
    {
    
     //Outros métodos da interface omitidos...
    
     public ICollection<Situacao> BuscarPorCriteria(string criteria, NpgsqlConnection connection)
    
     {
    
      ICollection<Situacao> situacoes = new Collection<Situacao>();
    
      String query = String.Format("Select * From dbo.Situacoes {0}", criteria);
    
    
    
      using (NpgsqlCommand command = connection.CreateCommand())
    
      {
    
       command.CommandText = query;
    
       command.Connection = GerenciadorConexoes.Connection;
    
    
    
       using (NpgsqlDataReader reader = command.ExecuteReader())
    
       {
    
       Situacao situacao = new Situacao();
    
       //Populo meu objeto...
    
       situacao.Alternativas = AlternativasDAO.BuscarPorCriteria(
    
       String.Format("Where Situacao = {0}", situacao.Codigo), connection);
    
       situacoes.Add(situacao);
    
       }
    
      }
    
      return situacoes;
    
     }
    
    }
    
    
    
    

    E tenho a AlternativaDAO, chamada pela SituacaoDAO:

    <pre lang="x-c#">public class AlternativaDAO : InterfaceDAO<Alternativa>
    
    {
    
     //Outros métodos da interface omitidos...
    
     public ICollection<Alternativa> BuscarPorCriteria(string criteria, NpgsqlConnection connection)
    
     {
    
      ICollection<Alternativa> alternativas = new Collection<Alternativa>();
    
      String query = String.Format("Select * From dbo.Alternativas {0}", criteria);
    
    
    
      using (NpgsqlCommand command = connection.CreateCommand())
    
      {
    
       command.CommandText = query;
    
       command.Connection = GerenciadorConexoes.Connection;
    
    
    
       using (NpgsqlDataReader reader = command.ExecuteReader())
    
       {
    
       Alternativa alternativa = new Alternativa();
    
       //Populo meu objeto...
    
       alternativas.Add(alternativa);
    
       }
    
      }
    
      return alternativas;
    
     }
    
    }
    
    
    
    

    No BuscarPorCriteria do AlternativaDAO, quando chega na linha:

    using (NpgsqlDataReader reader = command.ExecuteReader())

    Aparece a seguinte exceção:
    There is already an open DataReader associated with this Command which must be closed first.

    Não entendo porque está acontecendo isso com o DataReader; afinal, estou criando dois objetos Command diferentes, só compartilhando da mesma conexão, a fim de criar um pequeno pool de conexões. Alguém sabe o que pode ser?

    Desde já, grato pela atenção de todos!!

    terça-feira, 4 de janeiro de 2011 13:22

Respostas

  • Amigo, por default você so consegue utilizar um sqlconnetion para um datareader. Existe uma maneira de contornar isto chamada de MARS ou Multiple Active Result Set, segue um link para você dar uma lida sobre isto http://msdn.microsoft.com/en-us/library/ms130978.aspx

    basta você adicionar,no final da string de conexão, este trecho:
    MARS Connection=True;

    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    terça-feira, 4 de janeiro de 2011 13:28
  • O problema está justamente em utilizar somente uma conexão para dois DataReaders. Por padrão, cada DataReader exige uma conexão exclusiva. Entretanto, vc pode utilizar um recurso introduzido no .NET 2.0 chamado de MARS - Multiple Active Result Sets, que permite o uso de uma mesma conexão para vários DataReaders. Veja:

    http://www.israelaece.com/post/ADONET-MARS.aspx


    Ricardo Oneda Blog de Ricardo Oneda Perfil de Ricardo Oneda no Twitter Perfil MVP de Ricardo Oneda
    terça-feira, 4 de janeiro de 2011 13:35

Todas as Respostas

  • Amigo, por default você so consegue utilizar um sqlconnetion para um datareader. Existe uma maneira de contornar isto chamada de MARS ou Multiple Active Result Set, segue um link para você dar uma lida sobre isto http://msdn.microsoft.com/en-us/library/ms130978.aspx

    basta você adicionar,no final da string de conexão, este trecho:
    MARS Connection=True;

    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    terça-feira, 4 de janeiro de 2011 13:28
  • O problema está justamente em utilizar somente uma conexão para dois DataReaders. Por padrão, cada DataReader exige uma conexão exclusiva. Entretanto, vc pode utilizar um recurso introduzido no .NET 2.0 chamado de MARS - Multiple Active Result Sets, que permite o uso de uma mesma conexão para vários DataReaders. Veja:

    http://www.israelaece.com/post/ADONET-MARS.aspx


    Ricardo Oneda Blog de Ricardo Oneda Perfil de Ricardo Oneda no Twitter Perfil MVP de Ricardo Oneda
    terça-feira, 4 de janeiro de 2011 13:35