remarks cref c# ado.net

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.