Principales respuestas
VALIDACION CAPA DE NEGOCIO

Pregunta
-
Hola, buenas tardes, estoy realizando un sistema winform de 4 capas, pero tengo duda que se valida en la capa de presentación y que en la capa de negocio.
Deseo saber si la validación de campos vacíos, validación de datatable, validación de claves (si la ingresada en el sistema coincide con la almacenada en la bd) en que capa van.
A continuación escribo los métodos que utilizo en las diferentes capas:
CAPA DE DATOS
public DataTable ValidarUsuario(EntidadSesion objEntidadSesion)
{
try
{
AbrirConexion();
if (conexion.State == ConnectionState.Open)
{
dt = new DataTable();
ds = new DataSet();
cmSql = new SqlCommand("procValidarUsuarioSistema", conexion);
cmSql.CommandType = CommandType.StoredProcedure;
cmSql.Parameters.AddWithValue("@usuario", objEntidadSesion.Usuario);
adapter = new SqlDataAdapter(cmSql);
adapter.Fill(ds, "TbUsuarioSistema");
dt = ds.Tables["TbUsuarioSistema"];
}
}
catch
{
MessageBox.Show("ERROR AL VALIDAR AL USUARIO DEL SISTEMA.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
CerrarConexion();
}
return dt;
}
CAPA DE NEGOCIO
public DataTable ValidarUsuario(EntidadSesion objEntidadSesion)
{
return objNegocioSesion.ValidarUsuario(objEntidadSesion);
}
CAPA DE PRESENTACION
//ESTE METODO VA DENTRO DE UN BOTONprivate void ValidarUsuario()
objEntidadSesion.Usuario = txtUsuario.Text;
{
objEntidadSesion.Password = txtClave.Text;
if (objEntidadSesion.Usuario == string.Empty && objEntidadSesion.Password == string.Empty)
{
MessageBox.Show("DIGITE USUARIO Y CLAVE.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (objEntidadSesion.Usuario != string.Empty && objEntidadSesion.Password == string.Empty)
{
MessageBox.Show("DIGITE LA CLAVE.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (objEntidadSesion.Usuario == string.Empty && objEntidadSesion.Password != string.Empty)
{
MessageBox.Show("DIGITE EL USUARIO.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (objEntidadSesion.Usuario != string.Empty && objEntidadSesion.Password != string.Empty)
{
DataTable dt = objNegocioSesion.ValidarUsuario(objEntidadSesion);
if (dt.Rows.Count > 0)
{
foreach (DataRow dr in dt.Rows)
{
string clave = dr["clave"].ToString();
nombresUsuario = dr["Nombre"].ToString();
apellidosUsuario = dr["Apellido"].ToString();
usuario = dr["usuario"].ToString();
if (clave == objEntidadSesion.Password)
{
string mensaje = "BIENVENIDO " + nombresUsuario.ToUpper() + " " + apellidosUsuario.ToUpper();
}
}
}
else
{
MessageBox.Show("USUARIO NO SE ENCUENTRA REGISTRADO.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}Deseo saber si las validaciones realizadas en este metodo van ahi o en la capa de negocio.
Cualquier ayuda estare muy agradecido.
Respuestas
-
>>pero tengo duda que se valida en la capa de presentación y que en la capa de negocio.
la realidad es que deberia ser en ambas
por lo general las validacioens de tipos de datos, rangos, etc se validan en el cliente
validaciones mas complejas que requieren acceso a la db se realizan en la capa de negocio
>>Deseo saber si la validación de campos vacíos
capa de presentacion
>>validación de datatable
que es una validacion de datatable ?
>>validación de claves (si la ingresada en el sistema coincide con la almacenada en la bd)
capa de negocio
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
-
yo tengo l costumbre de las validaciones de campos requeridos, longitudes de texto de los campos, validaciones de tipo de datos tal como en un campo de tipo numerico no metas una cadena o validar fechas correctas... Todo ese tipo va en Presentación.
luego luego l resto de validaciones las aplicaria en negocio ya que dependen de un proceso de negocio como tal. Por ejemplo que el importe de una venta sea superior a x o lo que sea ...
Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos
- Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
-
>>A continuación escribo los métodos que utilizo en las diferentes capas:
en la capa de presentacion porque no usas el evento Validating del textbox para verificar si se completa el campo
no necesitas tantos if, tampoco tantas combinatorias, si se carga el password no depende de algun otro control
private void textbox1_Validating(...) { if(textbox1.Text == "") { Errorprovider1.SetError(textbox1, "El campo es obligatorio"); e.Cancel = true; } }
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
-
hola
la pregunta seria, si solo vas a validar un usuario porque usas un datatable ? no seria correcto
usa objetos, defines una clase del tipo
public class Usuario{ public string Nombre{get;set;} public string Apellido{get;set;} public string clave {get;set;} }
y le pasas esta al metodo
bool paso = objNegocioSesion.ValidarUsuario(usuario);
el metodo de validacion deberia devolver un true/false si pasa la autenticacion y no devolver la intancia
Login – Usando Password con Hash
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
-
Hola JCORBETTO,
Deberías separar las cosas:
- Por un lado es validar la existencia de un usuario en la base de datos
- Por otro lado es obtener mas información del usuario logeado
Ambos casos podrían escribirse en dos métodos que va desde la capa de datos a la de negocios y entrega la información solicitada a la capa de presentación.
En la capa de presentación deberías tener lo siguiente:
if (existeUsuario(txtUsuario.text, txtContraseña.Text)) { /*Usuario registrado*/ txtUsuarioConectado.Text = ObtenerUsuario(txtUsuario.text); } else { /*Usuario no registrado*/ }
Cada método tiene una responsabilidad única, el primero valida la existencia y el segundo retorna datos del usuario logeado. Queda claro que los métodos se llamarán y retornarán datos según lo que requieres, lo que muestro es sólo un ejemplo de como deberías abordar este caso.
- Editado Willams Morales martes, 3 de noviembre de 2015 21:26
- Propuesto como respuesta Karen MalagónModerator miércoles, 4 de noviembre de 2015 19:03
- Marcado como respuesta Karen MalagónModerator viernes, 6 de noviembre de 2015 22:34
-
>>utilizo un datatable porque aparte de validar si existe el nombre de usuario y el password, también consulto el nombre y el apellido
el tema es que son responsabilidades muy diferentes
una cosa es el login, alli solo validas si pasa o no con el usuario y password proporcionado
si pasa entonces recien alli recuperas los datos de la persona y no antes
por otro lado lo que planteas no justifica usar datatable, podrias usar un datareader y volcar los datos a la instancia de la una clase, de esta forma trabajar orientado a objetos, imagino has leido algo sobre POO
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta Karen MalagónModerator viernes, 6 de noviembre de 2015 22:34
Todas las respuestas
-
>>pero tengo duda que se valida en la capa de presentación y que en la capa de negocio.
la realidad es que deberia ser en ambas
por lo general las validacioens de tipos de datos, rangos, etc se validan en el cliente
validaciones mas complejas que requieren acceso a la db se realizan en la capa de negocio
>>Deseo saber si la validación de campos vacíos
capa de presentacion
>>validación de datatable
que es una validacion de datatable ?
>>validación de claves (si la ingresada en el sistema coincide con la almacenada en la bd)
capa de negocio
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
-
yo tengo l costumbre de las validaciones de campos requeridos, longitudes de texto de los campos, validaciones de tipo de datos tal como en un campo de tipo numerico no metas una cadena o validar fechas correctas... Todo ese tipo va en Presentación.
luego luego l resto de validaciones las aplicaria en negocio ya que dependen de un proceso de negocio como tal. Por ejemplo que el importe de una venta sea superior a x o lo que sea ...
Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos
- Marcado como respuesta JCORBETTO lunes, 23 de noviembre de 2015 2:04
-
>>A continuación escribo los métodos que utilizo en las diferentes capas:
en la capa de presentacion porque no usas el evento Validating del textbox para verificar si se completa el campo
no necesitas tantos if, tampoco tantas combinatorias, si se carga el password no depende de algun otro control
private void textbox1_Validating(...) { if(textbox1.Text == "") { Errorprovider1.SetError(textbox1, "El campo es obligatorio"); e.Cancel = true; } }
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
-
respecto a la capa de negocio no deberias mantener la conexion abierta, se supone que uses el using
algo como explico aqui
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Hola leandro, gracias por reponder, al consultar sobre validacion de datatable es si hay registros en el mismo por ejemplo:
DataTable dt = objNegocioSesion.ValidarUsuario(objEntidadSesion);
if (dt.Rows.Count > 0)
{
foreach (DataRow dr in dt.Rows)
{
string clave = dr["clave"].ToString();
nombresUsuario = dr["Nombre"].ToString();
apellidosUsuario = dr["Apellido"].ToString();usuario = dr["usuario"].ToString();
if (clave == objEntidadSesion.Password)
{
string mensaje = "BIENVENIDO " + nombresUsuario.ToUpper() + " " + apellidosUsuario.ToUpper();
}
}
}
else
{
MessageBox.Show("USUARIO NO SE ENCUENTRA REGISTRADO.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
}esta parte de codigo en que capa iria?
-
hola
la pregunta seria, si solo vas a validar un usuario porque usas un datatable ? no seria correcto
usa objetos, defines una clase del tipo
public class Usuario{ public string Nombre{get;set;} public string Apellido{get;set;} public string clave {get;set;} }
y le pasas esta al metodo
bool paso = objNegocioSesion.ValidarUsuario(usuario);
el metodo de validacion deberia devolver un true/false si pasa la autenticacion y no devolver la intancia
Login – Usando Password con Hash
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta JCORBETTO jueves, 12 de noviembre de 2015 1:58
-
Gracias Leandro por responder, utilizo un datatable porque aparte de validar si existe el nombre de usuario y el password, también consulto el nombre y el apellido del usuario conectado para mostrar un mensaje en el form padre, como es el siguiente:
USUARIO CONECTADO: LUIS PEREZ
Por eso utilizo datatable, la consulta sql que utilizo es:
SELECT clave, nombres, apellidos FROM TbUsuarioSistema WHERE Usuario = @usuario;
Después de eso valido si el datatable esta vació o no, mi pregunta es si esta validación va en la capa de negocio o presentación
-
Hola JCORBETTO,
Deberías separar las cosas:
- Por un lado es validar la existencia de un usuario en la base de datos
- Por otro lado es obtener mas información del usuario logeado
Ambos casos podrían escribirse en dos métodos que va desde la capa de datos a la de negocios y entrega la información solicitada a la capa de presentación.
En la capa de presentación deberías tener lo siguiente:
if (existeUsuario(txtUsuario.text, txtContraseña.Text)) { /*Usuario registrado*/ txtUsuarioConectado.Text = ObtenerUsuario(txtUsuario.text); } else { /*Usuario no registrado*/ }
Cada método tiene una responsabilidad única, el primero valida la existencia y el segundo retorna datos del usuario logeado. Queda claro que los métodos se llamarán y retornarán datos según lo que requieres, lo que muestro es sólo un ejemplo de como deberías abordar este caso.
- Editado Willams Morales martes, 3 de noviembre de 2015 21:26
- Propuesto como respuesta Karen MalagónModerator miércoles, 4 de noviembre de 2015 19:03
- Marcado como respuesta Karen MalagónModerator viernes, 6 de noviembre de 2015 22:34
-
>>utilizo un datatable porque aparte de validar si existe el nombre de usuario y el password, también consulto el nombre y el apellido
el tema es que son responsabilidades muy diferentes
una cosa es el login, alli solo validas si pasa o no con el usuario y password proporcionado
si pasa entonces recien alli recuperas los datos de la persona y no antes
por otro lado lo que planteas no justifica usar datatable, podrias usar un datareader y volcar los datos a la instancia de la una clase, de esta forma trabajar orientado a objetos, imagino has leido algo sobre POO
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta Karen MalagónModerator viernes, 6 de noviembre de 2015 22:34