none
Existencia de Items no SqlDataReader RRS feed

  • Pergunta

  • Galera, preciso de uma ajuda.

    Tentei procurar uma forma de tentar saber se existe um item dentro de um objeto SqlDataReader mas não consegui.

    Sei que quando consultado algum campo que não contém dentro do datareader uma exception é disparada. Tentei utilizar IsError mas não deu certo.

    Exemplo:
    objDataReader("CL_ID")

    Gostaria de saber se há o campo CL_ID dentro do objDataReader.

    Vocês sabem se tem como realizar esta operação?

    Agradeço qualquer ajuda.

    Obrigado.
    segunda-feira, 1 de outubro de 2007 20:58

Respostas

  • Ola Maicon,

    Para isso você terá que utilizar o método GetSchemaTable do DataReader que, por sua vez, retornará um DataTable onde você poderá pesquisar a existência do campo.

    terça-feira, 2 de outubro de 2007 12:29
  • Ola Maicon,

    Agora, com o DataTable em mãos, você tem a propriedade Columns da mesma. Basta utilizar o método IndexOf para verificar se existe a coluna desejada.

    quarta-feira, 3 de outubro de 2007 22:15

Todas as Respostas

  • Ola Maicon,

    Na versão 1.1 do .NET Framework foi criada nas classes XXXDataReader uma propriedade chamada HasRows, o qual retorna um valor Booleano indicando se há ou não linhas no DataReader. Caso exista, True é retornado, caso contrário, False.

    O uso desta propriedade é fundamental para verificar se foi ou não retornardo registro. Há casos em que é necessário usar e casos em que não é viavel. O uso do método Read() além de retornar True caso encontre o próximo registro, ele move-se para o próximo registro. Sendo assim, quando for exibir o conteúdo do DataReader, um registro a menos aparecerá. Talvez não tenho ficado muito claro, vamos ao exemplo com códigos. Imagine que a Query retorne 5 registros e é preciso exibi-los ao cliente.

    dr = comando.ExecuteReader()
    If dr.Read() Then
       While dr.Read()
             Console.WriteLine("Nome: " & _
             dr.GetString(1) & ", ")
       End While
    Else
       Console.WriteLine("Registro não encontrado.")
    End If

    Neste caso a exibição não será como esperamos, pois somente 4 registros são retornados. Isso acontece devido a utilização do método Read() para verificar a existência de registros. Como o Read() avança o DataReader e o mesmo é "foward-only", já foi passado pelo primeiro registro, não sendo possível retornar até a primeira posição.


    A solução para este problema é a utilização da propriedade HasRows ao invés do método Read() ao fazer a condicional, ficando da seguinte forma:

     

    If dr.HasRows Then
       While dr.Read()
             Console.WriteLine("Nome: " & _
             dr.GetString(1) & ", ")
       End While
    Else
       Console.WriteLine("Registro não encontrado.")
    End If

    Só que há um caso em que o método Read() é viável, quando você tem certeza que será retornado no máximo 1 (um) registro/linha, pois é possível verificar se é retornado True (encontrado o registro) e ler o mesmo.

    If dr.Read() Then
       Console.WriteLine("Nome: " & _
       dr.GetString(1) & ", ")
    Else
       Console.WriteLine("Registro não encontrado.")
    End If

    Como propriedade HasRows não existe na versão 1.0 do .NET Framework, uma alternativa é verificar a existência ou não de linhas na leitura através de uma condição no método Read(). Caso seja atendida, crie um loop Do...While percorrendo o DataReader até que o método Read() retorne False, ou seja, quando não houver mais registros. Assim, o primeiro registro sempre será exibido, pois a condição está no final do loop.

    If dr.Read() Then
       Do
         Console.WriteLine("Nome: " + _
         dr.GetString(1))
       Loop Until Not dr.Read()
    Else
       Console.WriteLine("Registro não encontrado.")
    End If

    • Sugerido como Resposta Apostolo segunda-feira, 14 de setembro de 2009 21:47
    segunda-feira, 1 de outubro de 2007 22:10
  • Certo Israel, obrigado pela atenção.

    Compriendi o que você me passou, porém, no caso, já executei o rd.Read(), mas eu preciso saber se nessa linha que estou há o campo chamado no exemplo acima, intende?

    Irei utilizar seu exmplo, porém um pouco adaptado a minha situação:

    If dr.HasRows Then
       If dr.Read() Then
    txbNomeCliente.Text = dr("CL_Nome")       
    txbID.Text = dr("CL_ID")
       End If
    End If


    ** Dentro do dr há vários compos, e entre estes campos preciso saber se há o campo CL_ID.

    Não sei se fui muito claro.

    Obrigado
    terça-feira, 2 de outubro de 2007 11:43
  • Ola Maicon,

    Para isso você terá que utilizar o método GetSchemaTable do DataReader que, por sua vez, retornará um DataTable onde você poderá pesquisar a existência do campo.

    terça-feira, 2 de outubro de 2007 12:29
  • Israel, obrigado pela ajuda.

    Só uma última dúvida:
    Através desta SchemaTable é necessário percorrer todas as colunas para verificar o nome dela certo?
    Pelo que pesquisei a respeito do método, é desta maneira, pois a grosso modo tentei utilizar a propriedade columns.Contains e não deu certo.

    A minha dificuldade era que a anta aqui esqueceu de retornar o CL_ID na store procedure, por isso não encontrava o campo, mas agora consigo utilizar o método IsDbNull para validar a existencia de dados no campo ou não.

    Mas fica então o novo conhecimento adquirido pela sua ajuda.

    Muito obrigado Israel.

    Maicon W. Matsubara


    terça-feira, 2 de outubro de 2007 13:21
  • Ola Maicon,

    Agora, com o DataTable em mãos, você tem a propriedade Columns da mesma. Basta utilizar o método IndexOf para verificar se existe a coluna desejada.

    quarta-feira, 3 de outubro de 2007 22:15
  • Muito obrigado por compartilhar o conhecimento. 100%

    Abraço.
    quinta-feira, 4 de outubro de 2007 13:11