Olá, galerinha!
Tudo bem?
Pra quem entende de .NET:
Bom, estou desenvolvendo uma aplicação para uso pessoal. Eis que surgiu um problema ao usar DataReaders.
Tenho lá uma classe POCO chamada Situacao. Essa situação pode conter diversas alternativas. Eis a classe:
public class Situacao : IComparable<Situacao>
{
public long Codigo { get; set; }
public String SituacaoTexto { get; set; }
public byte[] ImagemFundo { get; set; }
public ICollection<Alternativa> Alternativas { get; set; }
public Situacao()
{
Codigo = long.MinValue;
SituacaoTexto = String.Empty;
ImagemFundo = new byte[0];
Alternativas = new Collection<Alternativa>();
}
public Situacao(long anCodigo, String anSituacaoTexto, byte[] anImagemFundo, ICollection<Alternativa> anAlternativas)
{
Codigo = anCodigo;
SituacaoTexto = anSituacaoTexto;
ImagemFundo = anImagemFundo;
Alternativas = anAlternativas;
}
public Situacao(Situacao anSituacao)
{
Codigo = anSituacao.Codigo;
SituacaoTexto = anSituacao.SituacaoTexto;
ImagemFundo = anSituacao.ImagemFundo;
Alternativas = anSituacao.Alternativas;
}
public override string ToString()
{
return SituacaoTexto;
}
public int CompareTo(Situacao other)
{
return Codigo.CompareTo(other.Codigo);
}
public void AdicionarAlternativa(Alternativa objAlternativa)
{
Alternativas.Add(objAlternativa);
}
}
Beleza… Daí, para fazer a consulta de uma situação, faço assim:
public class SituacaoDAO : InterfaceBD, InterfaceDAO<Situacao>
{
public static ICollection<Situacao> BuscarSituacoes(long aventura, NpgsqlConnection connection)
{
ICollection<Situacao> situacoes = new Collection<Situacao>();
String query = String.Format("Select * From dbo.Situacoes Where Aventura = {0}", aventura);
using(NpgsqlDataReader reader = ExecuteReader(query, ConnectionManager.Connection))
{
while(reader.Read())
{
Situacao situacao = new Situacao();
//populo o objeto...
situacao.Alternativas = AlternativaDAO.BuscarAlternativasPorSituacao(situacao.Codigo, connection);
situacoes.Add(situacao);
}
reader.Close();
}
return situacoes;
}
}
E, para buscar as alternativas por situação…
public class AlternativaDAO : InterfaceBD, InterfaceDAO<Alternativa>
{
public static ICollection<Alternativa> BuscarAlternativasPorSituacao(long situacao, NpgsqlConnection connection)
{
ICollection<Alternativa> alternativas = new Collection<Alternativa>();
String query = String.Format("Select * From dbo.Situacoes Where Aventura = {0}", aventura);
using(NpgsqlDataReader reader = ExecuteReader(query, ConnectionManager.Connection))
{
while(reader.Read())
{
Alternativa alternativa = new Alternativa();
//populo o objeto...
alternativas.Add(situacao);
}
reader.Close();
}
return alternativas;
}
}
Beleza… O problema é que ele não deixa eu usar um DataReader novo enquanto outro estiver aberto.
Há a seguinte mensagem: There is already an open DataReader associated with this Command which must be closed first.
Alguém sabe o porquê disso? Alguém tem ideia de como posso solucionar essa situação?
Valeu, gente, fiquem com Deus! :]