Principales respuestas
Poder distinguir mayusculas y minusculas en el usuario y clave de una ventana

Pregunta
-
Buen dia gente.
Estoy armando una aplicacion de escritorio en C# para matar el aburrimiento y le puse una ventana al principio que pida un usuario y clave que lo busca en sql server.
El tema es que no se como hacer para distinguir las mayusculas y minusculas tanto en el usuario como clave, por ejemplo:
Usuario:administrador
Clave:admin1
Resultado: Loguea (Avanza a la siguiente ventana)
Usuario:adasdsad
Clave:adsasd
Resultado: No loguea (arroja un messageBox)
Usuario:AdMiNiStrAdOr
Clave: AdMiN1
Resultado: No sucede abosulamente nada
Como debo hacer? Soy nuevo en esto
Respuestas
-
Bien, el problema de que "no hace nada" cuando mezclas mayúsculas y minúsculas es simplemente que no se cumple el "if" donde comparas los valores devueltos, y cuando no se cumple no haces nada (no tiene un "else" para hacer algo al respecto).
Bien, y ¿por qué no se cumple el "if"? Pues porque usa el operador "==" que siempre es sensible a mayúsculas y minúsculas. En el lado del "select" se envía una consulta a la base de datos, que de forma predeterminada es insensible a mayúsculas, y ésta devuelve el dato tal como estaba grabado, que tiene una combinación de mayúsculas y minúsculas diferente del textbox que mandaste a buscar. Por lo tanto, cuando comparas el textbox con el valor devuelto, el resultado es falso.
Si quieres que admita la "mezcla" (el estándar es permitirla en el usuario pero no permitirla en la contraseña, pero por supuesto en tu programa puedes hacerlo distinto si es que así lo deseas), puedes cambiar el "==" por una de las sobrecargas del operador Equals de la clase string, que permite un parámetro opcional para indicar el tipo de comparación.
Si quieres que no permita la "mezcla", entonces está bien tal como lo tienes, pero le falta un "else" para mostrar el mensaje de rechazo. Seguramente ya tienes un mensaje así, pero lo tienes metido en el "catch" del "try" (que no se ve en el código aportado) con lo que solo lo muestra cuando se produce un error al acceder a la primera fila del dataset tras no haber encontrado ningún dato que coincida con la Select, pero no lo muestra si la fila se encuentra sin error pero después no encuentra coincidencia al comparar mayúsculas y minúsculas.
Por cierto, mucho cuidado con la Select que estás usando. Se te ha olvidado parametrizarla y en su lugar estás concatenando los datos tecleados por el usuario. Esto la hace vulnerable frente a ataques de inyección de SQL. El usuario podría, por ejemplo, teclear en el textbox una sentencia insert que meta en la base de datos un usuario y password nuevo (o que modifique la password de un usuario existente), y después hacer login con ese usuario y password.
- Marcado como respuesta Eric_96 lunes, 23 de marzo de 2020 23:34
Todas las respuestas
-
Resultado: No sucede abosulamente nada
-
Seguramente hay un error de programacion... este es el codigo del boton "Conectar":
try
{
string CMD = string.Format("Select * from Usuario where usuario ='{0}' and password = '{1}' ", txtUsuario.Text.Trim(), txtPassword.Text.Trim());
DataSet ds = Utilidades.Ejecutar(CMD);
Codigo = ds.Tables[0].Rows[0]["id_usuario"].ToString().Trim();
string usuario = ds.Tables[0].Rows[0]["usuario"].ToString().Trim();
string contraseña = ds.Tables[0].Rows[0]["password"].ToString().Trim();
if (usuario == txtUsuario.Text.Trim() && contraseña == txtPassword.Text.Trim())
{
if (Convert.ToBoolean(ds.Tables[0].Rows[0]["Status_admin"]) == true)
{
VentanaAdmin VenAd = new VentanaAdmin();
this.Hide();
VenAd.Show();
}
else
{
VentanaUser VenUs = new VentanaUser();
this.Hide();
VenUs.Show();
}
}si el usuario es del tipo administrador (en la tabla Usuario en sql server hay un campo que se llama Status_Admin, si este campo es 1 me lleva a la ventana administrador, si no es 1 me lleva a la ventana usuario)
Googlie pero no encontre otra cosa mejor
-
Bien, el problema de que "no hace nada" cuando mezclas mayúsculas y minúsculas es simplemente que no se cumple el "if" donde comparas los valores devueltos, y cuando no se cumple no haces nada (no tiene un "else" para hacer algo al respecto).
Bien, y ¿por qué no se cumple el "if"? Pues porque usa el operador "==" que siempre es sensible a mayúsculas y minúsculas. En el lado del "select" se envía una consulta a la base de datos, que de forma predeterminada es insensible a mayúsculas, y ésta devuelve el dato tal como estaba grabado, que tiene una combinación de mayúsculas y minúsculas diferente del textbox que mandaste a buscar. Por lo tanto, cuando comparas el textbox con el valor devuelto, el resultado es falso.
Si quieres que admita la "mezcla" (el estándar es permitirla en el usuario pero no permitirla en la contraseña, pero por supuesto en tu programa puedes hacerlo distinto si es que así lo deseas), puedes cambiar el "==" por una de las sobrecargas del operador Equals de la clase string, que permite un parámetro opcional para indicar el tipo de comparación.
Si quieres que no permita la "mezcla", entonces está bien tal como lo tienes, pero le falta un "else" para mostrar el mensaje de rechazo. Seguramente ya tienes un mensaje así, pero lo tienes metido en el "catch" del "try" (que no se ve en el código aportado) con lo que solo lo muestra cuando se produce un error al acceder a la primera fila del dataset tras no haber encontrado ningún dato que coincida con la Select, pero no lo muestra si la fila se encuentra sin error pero después no encuentra coincidencia al comparar mayúsculas y minúsculas.
Por cierto, mucho cuidado con la Select que estás usando. Se te ha olvidado parametrizarla y en su lugar estás concatenando los datos tecleados por el usuario. Esto la hace vulnerable frente a ataques de inyección de SQL. El usuario podría, por ejemplo, teclear en el textbox una sentencia insert que meta en la base de datos un usuario y password nuevo (o que modifique la password de un usuario existente), y después hacer login con ese usuario y password.
- Marcado como respuesta Eric_96 lunes, 23 de marzo de 2020 23:34
-