none
Erro banco de dados, asp.net RRS feed

  • Pergunta

  • Invalid attempt to access a field before calling Read()

    acontece este erro quando executo o código abaixo, o campo que esto puxando da bd é do tipo varchar, eu acredito que o problema esteja no reader, espero que me ajudem. obrigado.

         private void carregar_dados()
            {
                try
                {
                    MySqlCommand cmd = new MySqlCommand("SELECT url_foto FROM tb_dado_pessoal WHERE id_usu = @id_usu ", conexao);
                    cmd.Connection = conexao;
    
                    MySqlParameter pId = new MySqlParameter("id_usu", Session["id_usu"]);
                    cmd.Parameters.Add(pId);
    
                    MySqlDataReader reader = cmd.ExecuteReader();
                    reader.Read();
    
                    string url_img_perfil = Convert.ToString(reader["url_foto"]);
    
                    reader.Close();
    
                    if (url_img_perfil != null)
                    {
                        img_perfil.ImageUrl = url_img_perfil;
                    }
                }
                catch (Exception erro)
                {
                    Session["erro"] = erro.Message;
                    Response.Redirect("/identifica_erro.aspx");
                }
            }

    quarta-feira, 4 de dezembro de 2013 06:13

Respostas

  • Você também pode colocar o execute reader dentro de um while, ficaria da seguinte forma teu código

    private void carregar_dados()
    		{
    			try
    			{
    				using (MySqlCommand cmd = new MySqlCommand("SELECT url_foto FROM tb_dado_pessoal WHERE id_usu = @id_usu ", conexao))
    				{
    					cmd.Connection = conexao;
    
    					MySqlParameter pId = new MySqlParameter("id_usu", Session["id_usu"]);
    					cmd.Parameters.Add(pId);
    
    					using (MySqlDataReader reader = cmd.ExecuteReader())
    					{
    						string url_img_perfil = string.Empty;
    						while (reader.Read())
    						{
    							url_img_perfil = Convert.ToString(reader["url_foto"]);
    						}
    						reader.Close();
    
    						if (url_img_perfil != null)
    						{
    							img_perfil.ImageUrl = url_img_perfil;
    						}
    					}
    				}
    			}
    			catch (Exception erro)
    			{
    				Session["erro"] = erro.Message;
    				Response.Redirect("/identifica_erro.aspx");
    			}
    		}

    O uso de objetos que possuam Dispose, também é recomendado utilizar dentro do block using como ilustrado acima, isso faz com que o dispose seja invocado logo no final do código.

    Também pode tentar ao invés de while, uma segunda forma conforme exemplo abaixo.

    if (reader.HasRows)


    Gilson Joanelo - Desenvolvedor Web

    • Marcado como Resposta Lennon.exe quarta-feira, 4 de dezembro de 2013 16:03
    quarta-feira, 4 de dezembro de 2013 10:15

Todas as Respostas

  • Lennon,

    bom dia.

    Você está utilizando o método ExecuteReader. Este retorna um conjunto de valores para que você itere sobre ele.

    No seu caso é mais apropriado utilizar o método ExecuteScalar. Ele retornará 1 (um) e somente 1 (um) valor.

    Ficaria algo assim:

     string objUrl = cmd.ExecuteScalar();
          
    quarta-feira, 4 de dezembro de 2013 09:09
  • Você também pode colocar o execute reader dentro de um while, ficaria da seguinte forma teu código

    private void carregar_dados()
    		{
    			try
    			{
    				using (MySqlCommand cmd = new MySqlCommand("SELECT url_foto FROM tb_dado_pessoal WHERE id_usu = @id_usu ", conexao))
    				{
    					cmd.Connection = conexao;
    
    					MySqlParameter pId = new MySqlParameter("id_usu", Session["id_usu"]);
    					cmd.Parameters.Add(pId);
    
    					using (MySqlDataReader reader = cmd.ExecuteReader())
    					{
    						string url_img_perfil = string.Empty;
    						while (reader.Read())
    						{
    							url_img_perfil = Convert.ToString(reader["url_foto"]);
    						}
    						reader.Close();
    
    						if (url_img_perfil != null)
    						{
    							img_perfil.ImageUrl = url_img_perfil;
    						}
    					}
    				}
    			}
    			catch (Exception erro)
    			{
    				Session["erro"] = erro.Message;
    				Response.Redirect("/identifica_erro.aspx");
    			}
    		}

    O uso de objetos que possuam Dispose, também é recomendado utilizar dentro do block using como ilustrado acima, isso faz com que o dispose seja invocado logo no final do código.

    Também pode tentar ao invés de while, uma segunda forma conforme exemplo abaixo.

    if (reader.HasRows)


    Gilson Joanelo - Desenvolvedor Web

    • Marcado como Resposta Lennon.exe quarta-feira, 4 de dezembro de 2013 16:03
    quarta-feira, 4 de dezembro de 2013 10:15
  • Obrigado pela ajuda.
    quarta-feira, 4 de dezembro de 2013 16:04
  • Obrigado Gilson, adorei sua dica, funcionou perfeitamente.
    quarta-feira, 4 de dezembro de 2013 16:05