Intento de lectura no válido cuando no hay datos presentes

80
    private void button1_Click(object sender, EventArgs e)
    {
        string name;
        name = textBox5.Text;
        SqlConnection con10 = new SqlConnection("con strn");
        SqlCommand cmd10 = new SqlCommand("select * from sumant where username=@name");
        cmd10.Parameters.AddWithValue("@name",name);
        cmd10.Connection = con10;
        cmd10.Connection.Open();//line 7
        SqlDataReader dr = cmd10.ExecuteReader();
    }

    if ( textBox2.Text == dr[2].ToString())
    {
        //do something;
    }

Cuando depuro hasta la línea 7, está bien, pero luego el Dr. lanza una excepción: Invalid attempt to read when no data is present. eso no es posible porque tengo datos en la tabla con username = sumant. Por favor dígame si la declaración 'si' es correcta o no .........

¿Y cómo elimino el error?

cazador de conocimientos
fuente

Respuestas:

176

Tienes que llamar DataReader.Readpara obtener el resultado:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.Read()) 
{
    // read data for first record here
}

DataReader.Read()devuelve un que boolindica si hay más bloques de datos para leer, por lo que si tiene más de 1 resultado, puede hacer:

while (dr.Read()) 
{
    // read data for each record here
}
Julien Poulin
fuente
4
además de eso, es posible que desee intentar que los datos sean nulos usando dr.IsBDNull (0)
Luis Robles
Esta respuesta se puede mejorar, el primer fragmento no se ocupa del valor de retorno de dr.Read(). Entonces, si la consulta no devuelve registros, el error es el mismo: "Intento de lectura no válido cuando no hay datos presentes". En su lugar, use if(dr.Read()){....}(o un bucle como se muestra a continuación).
Tim Schmelter
17

Tienes que llamar dr.Read()antes de intentar leer cualquier dato. Ese método devolverá falso si no hay nada para leer.

Colin Mackay
fuente
9

Acabo de tener este error, estaba llamando en dr.NextResult()lugar de dr.Read().

Charlie
fuente
1
¡acaba de tener exactamente lo mismo! ¡Fue una hora frustrante!
JonnyRaa
8

Verificaría si el SqlDataReader tiene filas devueltas primero:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
   ...
}
dougczar
fuente
4
en mi caso tuve esto, y aunque lo he estado usando en otros lugares, en este escenario particular que produjo este error, esto NO detuvo el error. El resultado de mi consulta tiene filas y, sin embargo, el lector no tiene datos. Realmente no entiendo lo que está pasando. Verifiqué la consulta y los parámetros yo mismo.
Barry
3

Usé el siguiente código y funcionó para mí.

String email="";
    SqlDataReader reader=cmd.ExecuteReader();
    if(reader.Read()){
        email=reader["Email"].ToString();
    }

String To=email;
Aneel Goplani
fuente
2

Tenía 2 valores que podrían contener valores nulos.

while(dr.Read())
 {
    Id = dr["Id"] as int? ?? default(int?);
    Alt =  dr["Alt"].ToString() as string ?? default(string);
    Name = dr["Name"].ToString()
 }

resolvió el problema

Dev
fuente