Intento no válido de acceder a un campo antes de llamar a Read()
Frecuentes
Visto 2,088 equipos
1
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.
2 Respuestas
1
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
0
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 c# mysql database windows or haz tu propia pregunta.