Usuário com melhor resposta
Existencia de Items no SqlDataReader

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.
Respostas
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
-
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 -
-
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 -
-