Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno_Ferreira

Passar Resultado de uma consulta de uma Classe p/ o Form

Recommended Posts

Boa tarde galera,

 

estou fazendo uma aplicação que na qual preciso executar uma consulta a um banco de dados MySql e passar para uma ListView. de início fiz esse código que coloquei direto no formulário Form:

 

public void listaTarifas()
{
	try
	{
		MySqlCommand executar = new MySqlCommand("Select * from MobileBus.Tarifa", banco.conexao);
		MySqlDataReader lista;

		//abre a conexão
		banco.conexao.Open();

		//executa consulta e armazena resultado
		lista = executar.ExecuteReader();
		
		//preenche as colunas da tabela
		for (int i = 0; i < lista.FieldCount; i++)
			List_Tarifas.Columns.Add(lista.GetName(i));

		//preenche as linhas da tabela
		while (lista.Read())
		{
			//cria item auxiliar
			ListViewItem item = new ListViewItem();
			item.Text = lista.GetValue(0).ToString();

			for (int i = 1; i < lista.FieldCount; i++)
			{
				//cria subitens para o item
				item.SubItems.Add(lista.GetValue(i).ToString());
			}

			//adiciona ao ListView
			List_Tarifas.Items.Add(item);
		}
	}
	catch (Exception e)
	{
		System.Windows.Forms.MessageBox.Show("Erro ao executar consulta de Tarifas:\r\n" + e.ToString() + ".");
	}
	finally
	{
		banco.conexao.Close();
	}
}

Acontece que quero separar a parte de Banco de dados da parte de Apresentação, ou seja, colocar as consultas em uma classe Banco.cs por exemplo e O Form ficar separado.

 

Acontece que a consulta retorna um MySqlDataReader e não consigo trafegar com esse objeto de uma classe para outra que dá exceção, além disso, já tentei Ienumerator, pra qual apanhei, ArrayList e até matriz mas não consigo passar esses dados corretamente, sempre dá exceção ou retorna nada.

 

Alguém pode me dizer com posso separar as partes de banco e apresentação e passar o resultado da consulta corretamente? Me ajudaria muito.

 

valeu Galera!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imagino que voce tenha fechado a conexao antes de retornar o MySqlDataReader, isso nao pode!

DataReader e um objeto conectado, depois que voce fecha a conexao, os dados se perdem. Seu metodo precisa retornar o datareader com a conexao ainda aberta e quem vai fechar a conexao e a camada de apresentacao.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem,

 

De início, na classe banco fiz justamente o que o quintelab disse criando a seguinte função:

 

public MySqlDataReader listaTarifas()
		{
			try
			{
				MySqlCommand executar = new MySqlCommand("Select * from MobileBus.Tarifa",conexao);
				MySqlDataReader result;

				//abre a conexão, a conexão é configurada em outra função dessa mesma classe
				conexao.Open();

				//executa consulta e armazena resultado
				result = executar.ExecuteReader();
			}
			catch (Exception e)
			{
				System.Windows.Forms.MessageBox.Show("Erro ao executar consulta de Tarifas:\r\n" + e.ToString() + ".");
				return null;
			}
			finally
			{
				conexao.Close();
			}

			return result;
		}

Mas quando passo o resutado para o formulario, é ativada uma exeção justamente apontando que a conexão está fechada. De início imaginei que se tratava de classes diferentes e não poderia passar esse resultado nesse formato MySqlDataReader.

 

Então posso criar uma função publica para que o formulario manipule a conexão? Não há problema por se tratar de classes diferentes?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Remova o finally do seu método, e use ele assim:

 

using(MySqlDataReader dr = suaClasse.listaTarifas())
{
	while(dr.Read())
	{
	//Faz o que você quiser.
	}
}

O using() {} vai chamar o método Dipose do objeto dr, que por sua vez fai chamar o método Close que vai fechar a conexão. O uso de using nos DataReader é uma boa prática pois garante que a conexao não fique aberta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usei isso Oening, de início não deu erro nenhum, só que tá dando erro na minha classe de banco agora:

 

Criei a seguinte função para controlar a conexão:

 

public bool OpenConnection(){
			if (conexao.State.ToString() == "Closed"){
				conexao.Open();
				return true;
			}
			else{
				throw new Exception("A conexão já está aberta, feche a ultima sessão antes. ");
				return false;
			}
		}

A conexão para fechar é nessa mesma linha, fiz isso para que a classe formulario controlasse a conexão fechando-a depois que fizesse a consulta mas com o using, creio que não precise disso certo?

 

Agora está dando erro nessa função aqui no banco, apontando que a conexão deve estar aberta e válida. mas usei essa mesma conexão para listar as tarifas na função de consulta que fazia direto no formulario. e tomei justamente esse ciudado de abrí-la antes de executar a consulta, olhe a função:

 

public MySqlDataReader listaTarifas(){
			MySqlCommand executar = new MySqlCommand("Select * from MobileBus.Linhas");

			try{
				//executa consulta e armazena resultado
				result = executar.ExecuteReader();
			}
			catch (Exception e){
				System.Windows.Forms.MessageBox.Show("Erro ao executar consulta de Tarifas:\r\n" + conexao.ConnectionString.ToString() + "\r\n" +  e.ToString() + ".");
				return null;
			}
			return result;
		}

com o using, preciso abrir a conexão nessa função sem fechá-la? ou seja, posso abrir nessa função a conexão e o using da outra classe a fecha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso, você abre a conexão dentro do método listaTarifas() e não fecha ela aqui, deixa aberta.

O using pode estar em qualquer lugar, ele vai fechar a conexão.

 

Acho que ao inves de:

MySqlCommand executar = new MySqlCommand("Select * from MobileBus.Linhas");
Deveria ser:

this.OpenConnection();
MySqlCommand executar = new MySqlCommand("Select * from MobileBus.Linhas", conexao);

É um chute, não vi toda sua classe, mas a idéia é essa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

public MySqlConnection NewConn()
		{
			return new MySqlConnection ("string de conexao");
		}

public ListView ListaTarefas()
{
	using(var conn = new NewConn())
	{
	   conn.Open();
		var executar = new MySqlCommand("Select * from MobileBus.Tarifa", conn);
		MySqlDataReader lista = executar.ExecuteReader();		
		var List_Tarifas = new ListView();
		for (int i = 0; i < lista.FieldCount; i++)
			List_Tarifas.Columns.Add(lista.GetName(i));
		while (lista.Read())
		{
			ListViewItem item = new ListViewItem();
			item.Text = lista.GetValue(0).ToString();
			for (int i = 1; i < lista.FieldCount; i++)
				item.SubItems.Add(lista.GetValue(i).ToString());
			List_Tarifas.Items.Add(item);
		}
		return List_Tarifas;
	}
// esse codigo acima você colocar no seu projeto de acesso a dados DAO

 

// esse codigo abaixo você coloca na sua interface

 

 

var lv = new ListView();

lv = ListaTarefas();

 

 

espero ter ajudado

 

 

Icaro Ferreira

 

 

flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.