none
Erro ao comparar valores RRS feed

  • Pergunta

  • Boa tarde!

    Estou criando um método para comparar valores de 0 a 99 com valores armazenados em uma tabela e aramzenar os resultados em um vetor. Ao executar o método a seguir, surge a mensagem de erro "Conversão especificada não é válida.", na linha "valor = reader.GetInt32(j);". Veja:

                int valor;
                int cont = 0;
                int[] freq = new int[100];
     
                string queryString = "SELECT " +
                        "n01, n02, n03, n04, n05, n06, n07, n08, n09, n10, n11, n12, n13, n14, n15, n16, n17, n18, n19, n20 " +
                        "FROM concursos";

                using (OleDbConnection connection = new OleDbConnection(strConexao()))
                {
                    OleDbCommand command = new OleDbCommand(queryString, connection);
                    connection.Open();
                    OleDbDataReader reader = command.ExecuteReader();

                    for (int i = 0; i < 100; i++)
                    {
                        for (int j = 0; j < 20; j++)
                        {
                            while (reader.Read())
                            {
                                valor = reader.GetInt32(j); //O ERRO ACONTECE AQUI

                                if (valor == i)
                                    cont += 1;
                            }
                            freq[i] = cont;
                            cont = 0;
                        }
                    }
                }
                Connection.Dispose(); 

    A minha base de dados é Access e todos os campos são do tipo "Número" simples.

    Alguém poderia me ajudar a resolver este problema?



    • Editado Junior_bits sexta-feira, 3 de março de 2017 17:25
    sexta-feira, 3 de março de 2017 17:13

Respostas

  • Está obtendo somente os valores da primeira coluna porque o laço de repetição "while" está dentro do laço de repetição "for", e quando o reader é percorrido (através do método Read()) a variável "j" está com valor 0 (zero). Assim, quando "j" incrementar o valor, ele não irá entrar no while novamente, porque o reader já foi percorrido anteriormente. Se você quer percorrer todas as colunas do reader, terá de inserir os laços "for" dentro do"while".
    • Marcado como Resposta Junior_bits sexta-feira, 3 de março de 2017 18:47
    sexta-feira, 3 de março de 2017 18:08

Todas as Respostas

  • Olá, Benedito!

       Este erro está ocorrendo porque o valor que está contido no reader não é um número inteiro. O GetInt32 não executa nenhuma conversão, então o número já deve ser um inteiro. Tente utilizar o GetString, e depois converta para Int32.

    valor = Convert.ToInt32(reader.GetString(j));

    Mas o ideal mesmo é você descobrir qual valor está vindo no momento que dá a mensagem de erro. Você pode fazer um teste utilizando a Immediate Window para digitar lá reader.GetString(j), e descobrir qual é o valor real. Se for null, você terá que decidir como irá tratar este caso.

    Bom trabalho!


    • Editado Rodrigo CdS sexta-feira, 3 de março de 2017 17:39
    sexta-feira, 3 de março de 2017 17:38
  • Olá, Rodrigo. Obrigado pelos esclarecimentos!

    Uma dúvida: o reader do meu método só está percorrendo valores da primeira coluna. Você sabe me dizer o porquê disso?

    sexta-feira, 3 de março de 2017 17:59
  • Está obtendo somente os valores da primeira coluna porque o laço de repetição "while" está dentro do laço de repetição "for", e quando o reader é percorrido (através do método Read()) a variável "j" está com valor 0 (zero). Assim, quando "j" incrementar o valor, ele não irá entrar no while novamente, porque o reader já foi percorrido anteriormente. Se você quer percorrer todas as colunas do reader, terá de inserir os laços "for" dentro do"while".
    • Marcado como Resposta Junior_bits sexta-feira, 3 de março de 2017 18:47
    sexta-feira, 3 de março de 2017 18:08