Intento no válido de acceder a un campo antes de llamar a Read()

Estoy desarrollando una aplicación de Windows usando mysql y c#. En mi aplicación hay una página de inicio de sesión que tiene un botón de inicio de sesión. Cuando presiono el botón de inicio de sesión, no carga los valores de la base de datos y me da el siguiente error:

Intento no válido de acceder a un campo antes de llamar a Read().

Visual Studio indica mi siguiente código como error:

connection.Open();

string query2 = "SELECT * FROM newregistration where ID='" + id+"'";
MySql.Data.MySqlClient.MySqlCommand myCommand2 = new                 MySql.Data.MySqlClient.MySqlCommand(query2, connection);

// First Name Reader
MySqlDataReader fnamereader = myCommand2.ExecuteReader();
fnamereader.Read();
Fname = fnamereader.GetString(fnamereader.GetOrdinal("FirstName"));
fnamereader.Close();

// Second Name Reader
MySqlDataReader snamereader = myCommand2.ExecuteReader();
snamereader.Read();
Sname = snamereader.GetString(snamereader.GetOrdinal("SecondName"));
snamereader.Close();

// EMAIL ID Reader
MySqlDataReader emailreader = myCommand2.ExecuteReader();
emailreader.Read();
EmailID = emailreader.GetString(emailreader.GetOrdinal("EmailID"));
emailreader.Close();
DataSet ds = new DataSet();
MyAdapter.Fill(ds);

if (ds.Tables[0].Rows.Count > 0)
{
    profile windwo = new profile(this.id, this.Fname,this.Sname,this.EmailID);
    AddUserProfileInformation win = new AddUserProfileInformation(this.id);
     this.Hide();
    windwo.Show();
}
else
{
    MessageBox.Show("Sorry Wrong information entered.");
}

connection.Close();

Por favor, ayúdenme a resolver el problema ya que soy nuevo en el desarrollo.

preguntado el 08 de febrero de 14 a las 12:02

2 Respuestas

No necesita usar un separado MySqlDataReader cada columna de su consulta sql. solo usa uno MySqlDataReader y lea todos los valores de columna en él.

Parece que solo necesitas usar algo como;

if(fnamereader.Read())
{
   Fname = fnamereader.GetString(fnamereader.GetOrdinal("FirstName"));
   Sname = fnamereader.GetString(fnamereader.GetOrdinal("SecondName"));
   EmailID = fnamereader.GetString(fnamereader.GetOrdinal("EmailID"));
}

Pero más importante, siempre debes usar parameterized queries. Este tipo de concatenaciones de cadenas están abiertas para SQL Injection ataques.

string query2 = "SELECT * FROM newregistration where ID=@id";
MySqlCommand myCommand2 = new MySqlCommand(query2, connection);
myCommand2.Parameters.AddWithValue("@id", id);

Respondido 08 Feb 14, 12:02

No necesita seguir ejecutando el lector de datos antes de cada campo

   MySqlDataReader reader = myCommand2.ExecuteReader();
   reader.Read();
   Fname = reader.GetString(reader.GetOrdinal("FirstName"));
   Sname = reader.GetString(reader.GetOrdinal("SecondName"));
   EmailID = reader.GetString(reader.GetOrdinal("EmailID"));
   reader.Close();

Un par de otras cosas

  • Utilice sql parametrizado para vincular variables; no solo concatene la variable en texto sql; esto tiene beneficios de seguridad y rendimiento.
  • Debe comprobar el resultado booleano de la reader.Read() antes de usarlo

Respondido 08 Feb 14, 12:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.