Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 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!!!!
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.
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;
}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?
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.
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;
}
}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;
}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.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 abaixo você coloca na sua interface
var lv = new ListView();
lv = ListaTarefas();
espero ter ajudado
Icaro Ferreira
flw
Basta o método da sua classe retornar um objeto do tipo MySqlDataReader.
Como tinha feito este método?
Abraços...