2009-07-18 10 views
56
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 [email protected]"); 
     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 puedo depurar hasta la línea 7, que está bien, pero después de que el doctor se produce una excepción: Invalid attempt to read when no data is present. Eso no es posible, ya que tengo datos de la tabla con nombre de usuario = sumant. Por favor dígame si la declaración 'si' es correcta o no .........Intento no válido para leer cuando no hay datos está presente

¿Y cómo elimino el error?

Respuesta

128

usted tiene que llamar DataReader.Read a buscar el resultado:

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

DataReader.Read() devuelve una bool que indica si hay más bloques de datos a leer, por lo que si usted tiene más de 1 resultado, que puede hacer:

while (dr.Read()) 
{ 
    // read data for each record here 
} 
+4

además de eso, es posible que desee para tratar de que los datos sean nulos utilizando dr.IsBDNull (0) –

+0

Esta respuesta puede ser mejorado, el primer fragmento no toma el cuidado de la valor de retorno de 'dr.Read()'. Por lo tanto, si la consulta no devuelve registros, el error es el mismo: "Intento no válido de lectura cuando no hay datos presentes". En su lugar, use 'if (dr.Read()) {....}' (o un bucle como se muestra a continuación). –

13

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

6

me gustaría comprobar para ver si el SqlDataReader tiene filas devueltas en primer lugar:

SqlDataReader dr = cmd10.ExecuteReader(); 
if (dr.HasRows) 
{ 
    ... 
} 
+0

en mi caso tuve esto, y aunque he estado usando esto en otro lugar, en este escenario particular que produjo este error, esto NO detuvo el error de burbujeo. Mi consulta resultante tiene filas y, sin embargo, el lector no tiene datos. Realmente no entiendo lo que está pasando. Verificado la consulta y los parámetros yo mismo. – Barry

6

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

+1

acaba de tener exactamente lo mismo! ¡Esa fue una hora frustrante! –

1

He utilizado el siguiente código y funcionó para mí.

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

String To=email; 
0

Estaba teniendo 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() 
} 

resuelto el problema

Cuestiones relacionadas