Usuário com melhor resposta
guardar resutado de um select num array

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
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
-
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- Editado AndreAlvesLimaModerator sexta-feira, 27 de agosto de 2010 11:53 correcao
- Marcado como Resposta Ricardo_Araujo sexta-feira, 27 de agosto de 2010 12:04
-
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....- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 27 de agosto de 2010 11:52
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 27 de agosto de 2010 12:21
-
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
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
-
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....- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 27 de agosto de 2010 11:52
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 27 de agosto de 2010 12:21
-
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
-
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 -
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.... -
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- Editado AndreAlvesLimaModerator sexta-feira, 27 de agosto de 2010 11:53 correcao
- Marcado como Resposta Ricardo_Araujo sexta-feira, 27 de agosto de 2010 12:04