none
guardar resutado de um select num array RRS feed

  • Pergunta

  • Preciso de usar os vários resultados de um comando select e para isso pensei coloca-los num array. O problema é que não sei como faze-lo.

    Tenho o seguinte select

     

    MySql.Data.MySqlClient.MySqlConnection conId = new
     MySqlConnection(GetConnectionString());
    conId.Open();
    MySqlCommand CommandCadeiras = new MySqlCommand();
    CommandCadeiras.Connection = conId;
    CommandCadeiras.CommandText = "SELECT DISTINCT disciplina FROM tbl_alunos_disciplinas" ; CommandCadeiras.ExecuteNonQuery(); CommandCadeiras.Dispose(); conId.Close();

     

    O resultado do comando select como é de esperar é um conjunto de disciplinas.

    Agora queria guardar este conjunto de disciplinas num array para puder aceder a cada uma delas.


    Ricardo Araújo
    quinta-feira, 26 de agosto de 2010 23:10

Respostas

  • Ricardo,

    No seu caso, é só utilizar ExecuteReader ao invés de ExecuteNonQuery e depois disso, iterar sobre os itens retornados e acrescentá-los a um array... Tem um exemplo aqui:

    http://www.developerfusion.com/code/4390/placing-results-from-datareader-into-an-array/


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Ricardo_Araujo sexta-feira, 27 de agosto de 2010 02:12
    sexta-feira, 27 de agosto de 2010 00:01
    Moderador
  • Ricardo,

    Concordo com o Rui que utilizar List é melhor... Sugiro que você também dê uma olhada no Extension Method que ele postou ali em cima que ficou bem bacana...

    Agora, só pra te explicar porquê do jeito que você fez não está dando certo... Você está adicionando ao ArrayList um array de objects, portanto, na hora de pegá-los para setar o seu textbox, você precisa fazer o cast e pegar o primeiro índice... Ficaria assim:

    Label9.Text = ((object[]) al[2])[0].ToString();

    Uma forma mais fácil seria na hora que você está construindo o ArrayList, se você já adicionasse o texto da disciplina, ao invés do array de objetos:

    al.Add(values[0].ToString());

    Mas, de qualquer forma, dê uma olhada no código do Rui que ficou bem melhor e você vai aprender bastante coisa... :)


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 27 de agosto de 2010 11:52
    Moderador
  • Ola... não sei se existe uma forma mais pratica do que carrega o vetor com um DataReader.... 

    mas pode ser feito isso com um extension method pra ajudar (se nao me engano o MySqlCommand herda do DbCommand certo ?)

     

    public static class DatabaseExtensions {
     /// <summary>
     /// Executa uma consulta no banco de dados e retorna os valores da coluna informa em um vetor
     /// </summary>
     /// <typeparam name="T">Tipo de dados de retorno do vetor</typeparam>
     /// <param name="command">DbCommand com as informações de consulta no Banco de Dados</param>
     /// <param name="columIndex">Indice da coluna de retorno da query</param>
     /// <returns>Vetor com os dados existentes na consulta</returns>
     public static T[] ExecuteToArray<T>(this DbCommand command, int columIndex) {
      // Criar uma lista de retorno de dados
      var result = new List<T>();
    
      // Abrir um reader com o retorno da query
      var reader = command.ExecuteReader();
    
      // Se não retornar valores na consulta, retorna um vetor vazio
      if (!reader.Read()) return new T[0];
    
      // Verifica se o indice da coluna informado esta disponivel
      if (reader.FieldCount > columIndex)
       throw new Exception("O resultado da consulta possui menos colunas que o parametro informado");
    
      // Verifica se o tipo da coluna informada é o mesmo do tipo de retorno do vetor
      if ((reader[columIndex] is T) == false)
       throw new Exception("O tipo de dados da consulta não é compativel com o tipo de dados de retorno");
    
      // Carregar a lista de retorno com os valores da consulta
      do result.Add((T)reader[columIndex]); while (reader.Read());
    
      // Retorna o vetor de dados com as informações da consulta
      return result.ToArray();
     }
    }
    

     

    para usar basta usa o comando

    String[] resultado = CommandCadeiras.ExecuteToArray<String>(0);

    no lugar do

    CommandCadeiras.ExecuteNonQuery();


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sexta-feira, 27 de agosto de 2010 00:15
    Moderador
  • Fiz assim:

    MySql.Data.MySqlClient.MySqlConnection conId = new MySqlConnection(GetConnectionString());
        conId.Open();
    
        MySqlCommand CommandCadeiras = new MySqlCommand();
        CommandCadeiras.Connection = conId;
        CommandCadeiras.CommandText = "SELECT DISTINCT disciplina FROM tbl_alunos_disciplinas";
            
        ArrayList al = new ArrayList();
        MySqlDataReader dr = CommandCadeiras.ExecuteReader();
        
        while (dr.Read())
        {
          object[] values = new object[dr.FieldCount];
          dr.GetValues(values);
          al.Add(values);
        }
        CommandCadeiras.Dispose();
        conId.Close();
    

    Obrigado pela ajuda


    Ricardo Araújo
    • Marcado como Resposta Ricardo_Araujo sexta-feira, 27 de agosto de 2010 02:14
    sexta-feira, 27 de agosto de 2010 02:14

Todas as Respostas

  • Ricardo,

    No seu caso, é só utilizar ExecuteReader ao invés de ExecuteNonQuery e depois disso, iterar sobre os itens retornados e acrescentá-los a um array... Tem um exemplo aqui:

    http://www.developerfusion.com/code/4390/placing-results-from-datareader-into-an-array/


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Ricardo_Araujo sexta-feira, 27 de agosto de 2010 02:12
    sexta-feira, 27 de agosto de 2010 00:01
    Moderador
  • Ola... não sei se existe uma forma mais pratica do que carrega o vetor com um DataReader.... 

    mas pode ser feito isso com um extension method pra ajudar (se nao me engano o MySqlCommand herda do DbCommand certo ?)

     

    public static class DatabaseExtensions {
     /// <summary>
     /// Executa uma consulta no banco de dados e retorna os valores da coluna informa em um vetor
     /// </summary>
     /// <typeparam name="T">Tipo de dados de retorno do vetor</typeparam>
     /// <param name="command">DbCommand com as informações de consulta no Banco de Dados</param>
     /// <param name="columIndex">Indice da coluna de retorno da query</param>
     /// <returns>Vetor com os dados existentes na consulta</returns>
     public static T[] ExecuteToArray<T>(this DbCommand command, int columIndex) {
      // Criar uma lista de retorno de dados
      var result = new List<T>();
    
      // Abrir um reader com o retorno da query
      var reader = command.ExecuteReader();
    
      // Se não retornar valores na consulta, retorna um vetor vazio
      if (!reader.Read()) return new T[0];
    
      // Verifica se o indice da coluna informado esta disponivel
      if (reader.FieldCount > columIndex)
       throw new Exception("O resultado da consulta possui menos colunas que o parametro informado");
    
      // Verifica se o tipo da coluna informada é o mesmo do tipo de retorno do vetor
      if ((reader[columIndex] is T) == false)
       throw new Exception("O tipo de dados da consulta não é compativel com o tipo de dados de retorno");
    
      // Carregar a lista de retorno com os valores da consulta
      do result.Add((T)reader[columIndex]); while (reader.Read());
    
      // Retorna o vetor de dados com as informações da consulta
      return result.ToArray();
     }
    }
    

     

    para usar basta usa o comando

    String[] resultado = CommandCadeiras.ExecuteToArray<String>(0);

    no lugar do

    CommandCadeiras.ExecuteNonQuery();


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sexta-feira, 27 de agosto de 2010 00:15
    Moderador
  • Fiz assim:

    MySql.Data.MySqlClient.MySqlConnection conId = new MySqlConnection(GetConnectionString());
        conId.Open();
    
        MySqlCommand CommandCadeiras = new MySqlCommand();
        CommandCadeiras.Connection = conId;
        CommandCadeiras.CommandText = "SELECT DISTINCT disciplina FROM tbl_alunos_disciplinas";
            
        ArrayList al = new ArrayList();
        MySqlDataReader dr = CommandCadeiras.ExecuteReader();
        
        while (dr.Read())
        {
          object[] values = new object[dr.FieldCount];
          dr.GetValues(values);
          al.Add(values);
        }
        CommandCadeiras.Dispose();
        conId.Close();
    

    Obrigado pela ajuda


    Ricardo Araújo
    • Marcado como Resposta Ricardo_Araujo sexta-feira, 27 de agosto de 2010 02:14
    sexta-feira, 27 de agosto de 2010 02:14
  • Como consigo agora ler um dos valores que ficaram no arraylist?

     

    Label9.Text = al.Count.ToString();    //assim resulta o valor 12 que está certo porque eu tinha 12 disciplinas na tabela

     

    Mas não sei como faço para meter na label por exemplo a segunda disciplina.

     

    Label9.Text = al[2].ToString();  // tentei isto mas o resultado é  "System.Object[] "

     

     


    Ricardo Araújo
    sexta-feira, 27 de agosto de 2010 02:57
  • Ricardo da uma olhada no codigo que eu coloquei acima, principalmente nos comentarios...

    Primeiro aconcelho a usar o List<> ao inves do ArrayList... é mais facil

    depois tem uma serie de verificações importantes citadas no fonte...


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sexta-feira, 27 de agosto de 2010 03:01
    Moderador
  • Ricardo,

    Concordo com o Rui que utilizar List é melhor... Sugiro que você também dê uma olhada no Extension Method que ele postou ali em cima que ficou bem bacana...

    Agora, só pra te explicar porquê do jeito que você fez não está dando certo... Você está adicionando ao ArrayList um array de objects, portanto, na hora de pegá-los para setar o seu textbox, você precisa fazer o cast e pegar o primeiro índice... Ficaria assim:

    Label9.Text = ((object[]) al[2])[0].ToString();

    Uma forma mais fácil seria na hora que você está construindo o ArrayList, se você já adicionasse o texto da disciplina, ao invés do array de objetos:

    al.Add(values[0].ToString());

    Mas, de qualquer forma, dê uma olhada no código do Rui que ficou bem melhor e você vai aprender bastante coisa... :)


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 27 de agosto de 2010 11:52
    Moderador