0

espero que me puedan ayudar con el siguiente codigo que tengo en visual studio, estoy programando un login de usuarios, en asp.net con c# y resulta que en mi formulario aspx llamado PortalAlumons.aspx.cs escribí el siguiente codigo:

protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection SqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectSQL"].ToString());
        SqlCon.Open();

        string query = "SELECT * FROM sisacad.USUARIO WHERE Rut_Nro = '"+Txt_RutNro.Text+"' AND Rut_Dig = ' "+Txt_RutDigito.Text+" ' AND Contrasena = ' "+Txt_Pass.Text+" '  ";

        SqlCommand cMD = new SqlCommand(query, SqlCon);

        string output = cMD.ExecuteScalar().ToString(); //ESTA LINEA ME ARROJA EL ERROR

        if (output == "1")
        {
            Session["user"] = Txt_RutNro.Text;
            Response.Redirect("~/Alumno.aspx");
        }
        else 
        {
            Response.Write("Conexion Fallida");
        }
    }

Resulta que el error que me arroja dice lo siguiente:

Referencia a objeto no establecida como instancia de un objeto.

Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.

Detalles de la excepción: System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.

Error de código fuente:

Línea 23:

Línea 24: SqlCommand cMD = new SqlCommand(query, SqlCon);

Línea 25: string output = cMD.ExecuteScalar().ToString();

Línea 26:

Línea 27: if (output == "1")

Esto me pasa cuando hago clic en un enlace que me redirecciona a la pagina del portal de los alumnos, donde el alumno podra iniciar sesion y posteriormente ingresar a su web personal de estudios. Y la linea del error es la 25.

Si me pudieran ayudar estaria muy agradecido, gracias.

Rafael Bautista
  • 2,603
  • 6
  • 20
  • 35
  • el método `cMD.ExecuteScalar();` está retornando `null` , haga la verificación correspondiente antes de acceder al método `toString();` – Dev. Joel Jan 03 '18 at 05:58
  • 1
    te recomiendo que en la consulta no busques por select *, sino por select count(0), de este modo si existe el resultado sera 1 y sino 0, asi nunca sera null. – U. Busto Jan 03 '18 at 08:32
  • revisa tu query, estas haciendo un "SELECT * ", estas consultando todos los registros de la tabla y luego abajo pretendes tratarlo como un escalar.. – jcparra Jan 03 '18 at 08:09
  • Este sitio apesta –  Mar 26 '18 at 12:51

1 Answers1

1

Veo bastantes problemas en tu código.

El error se está produciendo por que cMD.ExecuteScalar() está devolviendo null. ExecuteScalar se utiliza normalmente cuando una consulta devuelve un único dato en lugar de un conjunto de registros, normalmente cuando se realiza una consulta con una función de agregado sin GROUP BY.

Si, como en tu caso, lo aplicas a una consulta que va a devolver datos de diferentes campos, lo que hará será devolver el valor del primer campo del primer registro, o null si la consulta no devuelve ningún resultado.

Es decir, si no encuentra ninguna coincidencia el resultado no será 0 si no null.

Por otro lado tu código es un ejemplo claro de código vulnerable a un ataque por Sql Injection (te recomendaría buscar un poco sobre el tema por internet). Para evitar esto, y por otras razones como claridad de código o rendimiento, deberías acostumbrarte a construir siempre tus consultas introduciendo los valores a través de parámetros.

Échale un vistazo a este ejemplo:

protected void Page_Load(object sender, EventArgs e)
{
    SqlConnection SqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectSQL"].ToString());
    SqlCon.Open();

    string query =
        "SELECT COUNT(*) FROM sisacad.USUARIO WHERE Rut_Nro=@RutNro AND Rut_Dig=@RutDig AND Contrasena=@Pass";
    SqlCommand cMD = new SqlCommand(query, SqlCon);
    cMD.Parameters.AddWithValue("@RutNro", Txt_RutNro.Text);
    cMD.Parameters.AddWithValue("@RutDig", Txt_RutDigito.Text);
    cMD.Parameters.AddWithValue("@Pass", Txt_Pass.Text);

    int output = (int)cMD.ExecuteScalar();

    if (output>0)
    {
        Session["user"] = Txt_RutNro.Text;
        Response.Redirect(@"~/Alumno.aspx");
    }
    else
    {
        Response.Write("Conexion Fallida");
    }
}
Asier Villanueva
  • 14,299
  • 2
  • 13
  • 31