c# - cref - Intento no válido de leer cuando no hay datos.
remarks c# (6)
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 después de eso dr arroja una excepción: Invalid attempt to read when no data is present.
Eso no es posible ya que tengo datos en la tabla con nombre de usuario = sumant. Por favor dígame si la declaración ''si'' es correcta o no .........
¿Y cómo elimino el error?
Acabo de tener este error, estaba llamando a dr.NextResult()
lugar de dr.Read()
.
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
Tienes que llamar a DataReader.Read
para obtener el resultado:
SqlDataReader dr = cmd10.ExecuteReader();
if (dr.Read())
{
// read data for first record here
}
DataReader.Read()
devuelve un bool
indica 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
}
Usé el código a continuación y funcionó para mí.
String email="";
SqlDataReader reader=cmd.ExecuteReader();
if(reader.Read()){
email=reader["Email"].ToString();
}
String To=email;
Verificaría si el SqlDataReader tiene filas devueltas primero:
SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
...
}
dr.Read()
llamar a dr.Read()
antes de intentar leer cualquier dato. Ese método devolverá falso si no hay nada que leer.