none
ExecuteReader - Mensagem de erro RRS feed

  • Pergunta

  • Ao executar a instrução: CType(Master, ConMAN).preencheUsuario = dr("nom_NomeUsuario") + " " + dr("nom_Sobrenome")

    Aperece o erro: Tentativa invalida de leitura quando não existem dados. 

    Private Function verificaUsuario() As Boolean 

    Dim strSQL As String
    Dim usu As String = "c035562" 'Right(User.Identity.Name, 7)

    strSQL =

    "SELECT cod_ID_Usuario, nom_NomeUsuario, nom_Sobrenome, num_ID_Permissao" _
    &
    " FROM T_Usuarios WHERE (cod_ID_Usuario = @cod_ID_Usuario)"

    Dim
    conn As New SqlConnection
    conn.ConnectionString = ConfigurationManager.ConnectionStrings(
    "CaminhoBD").ToString
    Dim cmd As New SqlCommand
    cmd.Connection = conn
    cmd.CommandType = Data.CommandType.Text
    cmd.Parameters.Add(
    "@cod_ID_Usuario", Data.SqlDbType.VarChar).Value = usu
    cmd.CommandText = strSQL 
     

    Dim dr As SqlDataReader
    conn.Open() 
     

    dr = cmd.ExecuteReader

    'Verifica se foi retornado registros
    Dim intNum As Integer = 0  

    While dr.Read
    intNum = intNum + 1
    End While 

    If intNum = 0 Then
    Return False
    Else
    CType(Master, ConMAN).preencheCodUsuario = usu
    CType(Master, ConMAN).preencheUsuario = dr("nom_NomeUsuario") + " " + dr("nom_Sobrenome")
    Return True
    End If  

    dr.Close()
    conn.Close()


    Sergio Ivanenko

    • Editado Ivanenko segunda-feira, 19 de outubro de 2009 11:20
    domingo, 18 de outubro de 2009 02:55

Respostas

  • Ivan use esse código para saber se há linhas:

    If dr.HasRows Then
    
    End If
    E então só use o dr.Read na hora de ler os dados, o SqlDataReader é um cursor que só vai pra frente, então como você executa o dr.Read no while ele passa por todas linhas assim como Dennes explicou.
    • Sugerido como Resposta Ari C. Raimundo segunda-feira, 19 de outubro de 2009 17:09
    • Marcado como Resposta Ivanenko quarta-feira, 21 de outubro de 2009 01:03
    segunda-feira, 19 de outubro de 2009 12:43

Todas as Respostas

  • Oi,

    Em nenhum momento você rodou o executeReader (que pode devolver  a quantidade de registros retornados) mas neste trecho :

    While dr.Read
    intNum = intNum + 1
    End While  

    Você faz um loop até após o último registro, contando as linhas. Mesmo que o executeReader esteja lá e este trecho esteja depois, você está posicionando o datareader após o fim dos dados.

    []'s
    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel :  (11) 3170-3056  (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    domingo, 18 de outubro de 2009 23:33
  • Dennes, Houve uma falha minha ao postar o código, faltou o "dr = cmd.ExecuteReader", a mensagem de erro está ocorrendo, porque?
    Sergio Ivanenko
    segunda-feira, 19 de outubro de 2009 11:22
  • Oi,

    Porque no trecho que indiquei você está movendo o datareader para o fim dos dados. Tire aquele trecho fora.

    []'s
    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel :  (11) 3170-3056  (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    segunda-feira, 19 de outubro de 2009 12:08
  • Ivan use esse código para saber se há linhas:

    If dr.HasRows Then
    
    End If
    E então só use o dr.Read na hora de ler os dados, o SqlDataReader é um cursor que só vai pra frente, então como você executa o dr.Read no while ele passa por todas linhas assim como Dennes explicou.
    • Sugerido como Resposta Ari C. Raimundo segunda-feira, 19 de outubro de 2009 17:09
    • Marcado como Resposta Ivanenko quarta-feira, 21 de outubro de 2009 01:03
    segunda-feira, 19 de outubro de 2009 12:43