Login con clase

21/01/2008 - 21:58 por Martin | Informe spam
Hola, que tal, bueno yo solia programar en Visual Basic 6.0 y ahora estoy
aprendiendo C#, y deseo crear un formulario simple para validar login, hice
mi clase y bueno tambien les paso el codigo del formulario, por si me pueden
ayudar, la base de datos esta hecha en Access

namespace Login
{
class clsUsuario
{
BaseDatos objDB = new BaseDatos();

public int Obtener_IdUsuario(string strUsuario)
{
int IdUsuario=0;
string strSQL;

strSQL = "SELECT Id_Usuario FROM Usuario WHERE Usuario='" +
strUsuario + "'";

/*Parte referente a la conexión y configuración para la
ejecución*/
OleDbConnection conn = (OleDbConnection)objDB.conn;
conn.Open();
OleDbCommand comando = new OleDbCommand(strSQL, conn);

OleDbDataReader odr = comando.ExecuteReader();

return IdUsuario;
}

public string Obtener_Usuario(int IdUsuario)
{
string Usuario=null;
string strSQL1;

strSQL1 = "SELECT Usuario.IdUsuario, Usuario.Nombre,
Usuario.Usuario, Usuario.Id_TipoUsuario, Tipo_Usuario.Nombre"+
"FROM Tipo_Usuario INNER JOIN Usuario ON
Tipo_Usuario.Id_TipoUsuario=Usuario.Id_TipoUsuario"+
"WHERE Usuario.IdUsuario='" + IdUsuario + "'";

OleDbConnection conn = (OleDbConnection)objDB.conn;
conn.Open();
OleDbCommand comando = new OleDbCommand(strSQL1, conn);

OleDbDataReader odr = comando.ExecuteReader();
return Usuario;
}
}
}

/********************Codigo del formulario para el login
***************************/

namespace TestConexion1
{
public partial class frmInicio : Form
{
public frmInicio()
{
InitializeComponent();
}

private void btnAceptar(object sender, EventArgs e)
{
if (txtUsuario.Text != "" || txtUsuario.Text != "0")
{
if (txtContrasena.Text != "")
{
OleDbDataReader odrId = null;

/*Obtener Id del Usuario*/
clsUsuario objUsuario = new clsUsuario();

string Usuario = this.txtUsuario.Text.Trim();
string Contrasena = this.txtContrasena.Text.Trim();

odrId = objUsuario.Obtener_IdUsuario(Usuario); //No se
puede convertir implicitamente el tipo int a
//System.Data.OledbDataReader

if (odrId.Read())
{
MessageBox.Show("El Usuario no existe");
txtUsuario.Text = "";
txtContrasena.Text = "";
}
else
{
int IdUsuario = (int)odrId[0];

/*Obtener Usuario*/
OleDbDataReader odrUsu = null;

odrUsu = objUsuario.Obtener_Usuario(IdUsuario); //No
se puede convertir implicitamente el tipo string a
//System.Data.OledbDataReader

if (odrUsu.Read() = Contrasena) //como Cotejo la
contraseña??
{
MessageBox.Show("Bienvenido al Sistema");
}
else
{
MessageBox.Show("La contraseña no corresponde al
Usuario");
txtContrasena.Text = "";
}
}
}
else
{
MessageBox.Show("Debe Ingresar la Contraseña");
}
}
else
{
MessageBox.Show("Debe Ingresar el nombre del Usuario");
}
}

private void btnCancelar_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}



Una pregunta adicional, El ADODB.Recordset del Visual Basic 6.0, cual seria
su equivalente para el C#??, y como usarlo para validar la contraseña, es que
nose bien como comparar que la contraseña que se ingresa es la misma de la
base de datos.
 

Leer las respuestas

#1 Alberto Poblacion
22/01/2008 - 08:38 | Informe spam
"Martin" wrote in message
news:
Hola, que tal, bueno yo solia programar en Visual Basic 6.0 y ahora estoy
aprendiendo C#, y deseo crear un formulario simple para validar login,
hice
mi clase y bueno tambien les paso el codigo del formulario, por si me
pueden
ayudar, la base de datos esta hecha en Access

namespace Login
{
class clsUsuario
{
BaseDatos objDB = new BaseDatos();

public int Obtener_IdUsuario(string strUsuario)
{
int IdUsuario=0;
string strSQL;

strSQL = "SELECT Id_Usuario FROM Usuario WHERE Usuario='" +
strUsuario + "'";

/*Parte referente a la conexión y configuración para la
ejecución*/
OleDbConnection conn = (OleDbConnection)objDB.conn;
conn.Open();
OleDbCommand comando = new OleDbCommand(strSQL, conn);

OleDbDataReader odr = comando.ExecuteReader();

return IdUsuario;
}



Cosas que veo:
- Abres una conexión y un datareader, pero no cierras ninguno de los
dos. Mientras no cierres el datareader, la conexión no se puede usar para
nada más. Si no cierras la conexión, irás consumiendo poco a poco las
conexiones disponibles, y cuando el programa lleve un tiempo funcionando
acabará dando un error.
- Devuelves un int, que no rellenas nunca. Esta función siempre
devolverá cero.
- Ejectas el command, obteniendo un datareader, pero no lo usas para
nada.
- La sentencia que construyes permite ataques de inyección de SQL.

Sugerencia de corrección:

public int Obtener_IdUsuario(string strUsuario)
{
string strSQL = "SELECT Id_Usuario FROM Usuario WHERE
Usuario=@Usu";
using (OleDbConnection conn = (OleDbConnection)objDB.conn)
{
conn.Open();
OleDbCommand comando = new OleDbCommand(strSQL, conn);
comando.Parameters.AddWithValue("@Usu", strUsuario);
object resul = comando.ExecuteScalar();
if (resul is int) return (int)resul;
}
return 0; //No encontrado
}

[...]
/********************Codigo del formulario para el login
[...]
OleDbDataReader odrId = null;
[...]
odrId = objUsuario.Obtener_IdUsuario(Usuario); //No se
puede convertir implicitamente el tipo int a
//System.Data.OledbDataReader



La rutina Obtener_IdUsuario que has escrito devuelve un int. No puedes
meter el int dentro de una variable de tipo OleDbDataReader.

if (odrId.Read())
{
MessageBox.Show("El Usuario no existe");



Suponiendo que te hubieras traído el DataReader hasta aqui, el "if" está
al revés, es decir, el Read devuelve true cuando SI que existe el registro,
no cuando no existe.

[...]
if (odrUsu.Read() = Contrasena) //como Cotejo la
contraseña??



Si tienes un DataReader (pero ten presente que ninguna de las rutinas
que has escrito más arriba devuelve un DataReader), cada uno de los campos
se puede extraer por nombre o por índice, usando el indexador del
DataReader. El método Read lo único que hace es posicionarse sobre el
siguiente registro, y devolver false si no hay más registros:

if (odrUsu.Read())
{
string contra = (string)odrUsu["Campo"];
if (contra == Contrasena) ...
}

[...]
Una pregunta adicional, El ADODB.Recordset del Visual Basic 6.0, cual
seria
su equivalente para el C#??



No hay un equivalente exacto. El DataReader es un cursor de
solo-marcha-alante y solo-lectura, que sería análogo a un Recordset abierto
con dichas mismas opciones. También tienes el DataSet, que sería más o menos
equivalente a un Recordset desconectado. Pero el Recordset de marcha-alante
y marcha-atrás, en modo lectura/escritura, no tiene un equivalente en
ADO.NET.

Preguntas similares