Pregunta sobre diseño aplicación: Control de errores Base de Datos

24/02/2004 - 11:18 por Alejandro Bibiano González | Informe spam
A ver si me explico bien y alguien me puede ayudar con esta questión de
diseño.

Estoy desarrollando ua aplicación Cliente/Servidor tradicional con WinForms
en C#.

Me he creado unos dataset personalizados para cada tabla, así como un objeto
que gestiona los inserts, updates y selects.

Por ejemplo, tengo una clase Usuario que tiene métodos para seleccionar,
insertar y modificar usuarios (siempre a través de un dataset).

En mis formularios uso este objeto para poblar los dataset y actualizar los
datos. Hasta aquí todo bastante bien, pero ahora viene mi pregunta. ¿Donde
hago el control de errores? Por ejemplo, quiero comprobar que no haya 2
usuarios con el mismo nombre. En la base de datos el campo es "Unique" por
lo que mi objeto usuario lanzará una excepción cuando intente actualizar los
datos. ¿Debo controlar este error en mi objeto usuario (al haser el update
del dataadapter), en el formulario donde hago la actualización, o en otro
sitio?

Me gustaría centralizar la detección de errors de base de datos para no
tener que repetir siempre el mismo código.

Saludos y gracias

Alex Bibiano

Preguntas similare

Leer las respuestas

#1 Camilo Villa
24/02/2004 - 14:42 | Informe spam
Si manejas una arquitectura de 3 niveles, las validaciones las harías en los
objetos que invocan directamente a los Storeprocedures, bajo el esquema Try,
catch Finally.

Te recomiendo trabajar con objetos SqlTransaction, y los objetos Command
como StoreProcedures donde trates los procesos de inserción, actualización y
borrado a nivel de transacciones y así puedes controlar los errores de
duplicación. o de base de datos.

ejemplo:



public void EjecutarTransaccionSql(string miCadenaConexion)
{
SqlConnection miConexion = new SqlConnection(miCadenaConexion);
miConexion.Open();

SqlCommand myCommand = miConexion.CreateCommand();
SqlTransaction miTransaccion;

// Inicia una transacción local
miTransaccion = miConexion.BeginTransaction();
// Debe asignar ambos objetos el de conexion y el de transacción
// al objeto Comando el cual depende de la transacción local
myCommand.Connection = miConexion;
myCommand.Transaction = miTransaccion;

try
{
//Aquí las transacciones de inserción, actualización o borrado
miTransaccion.Commit(); // Confirma que efectivamente se halla
realizado la transacción,
}
catch(Exception e) //Captura excepciones generales.
{
try
{
miTransaccion.Rollback(); //Le hace RollBack a la transacción si
encuentra alguna transacción
}
catch (SqlException ex) //Captura excepciones de Sql.
{
if (miTransaccion.Connection != null)
{
MessageBox.Show("una Excepción de Tipo" + ex.GetType() + "fue
encontrada mientras se intentaba hacer un roll back a la transacción.");
}
}
MessageBox.Show("Una excepción de tipo " + e.GetType() + " fue
encontrada mientras se intentaba insertar datos.");
MessageBox.Show("Ningun registro fue grabado en la base de datos.");
}
finally
{
miConexion.Close();
}
}

Camilo Villa
APTECH Certified Visual Studio .NET - Microsoft 3 DCE
"Alejandro Bibiano González" escribió en el
mensaje news:u1pID%23r%
A ver si me explico bien y alguien me puede ayudar con esta questión de
diseño.

Estoy desarrollando ua aplicación Cliente/Servidor tradicional con


WinForms
en C#.

Me he creado unos dataset personalizados para cada tabla, así como un


objeto
que gestiona los inserts, updates y selects.

Por ejemplo, tengo una clase Usuario que tiene métodos para seleccionar,
insertar y modificar usuarios (siempre a través de un dataset).

En mis formularios uso este objeto para poblar los dataset y actualizar


los
datos. Hasta aquí todo bastante bien, pero ahora viene mi pregunta. ¿Donde
hago el control de errores? Por ejemplo, quiero comprobar que no haya 2
usuarios con el mismo nombre. En la base de datos el campo es "Unique" por
lo que mi objeto usuario lanzará una excepción cuando intente actualizar


los
datos. ¿Debo controlar este error en mi objeto usuario (al haser el update
del dataadapter), en el formulario donde hago la actualización, o en otro
sitio?

Me gustaría centralizar la detección de errors de base de datos para no
tener que repetir siempre el mismo código.

Saludos y gracias

Alex Bibiano


Respuesta Responder a este mensaje
#2 Alejandro Bibiano González
24/02/2004 - 15:43 | Informe spam
Gracias por responder, pero tengo una pregunta acerca de tu propuesta.

Si capturo el error en los objetos que invocan la BD (es el método que usaba
actualmente), ¿es recomendable que ese mismo objeto haga aparecer un
messagebox con el error?

Es que no tengo muy claro donde hacer aparecer el mensaje de error.
Directamente en la clase que realiza el acceso a datos, o desde el
formulario que usa este objeto para actualizar los datos (en este caso debo
propagar la excepción).

"Camilo Villa" escribió en el mensaje
news:uc79kvt%
Si manejas una arquitectura de 3 niveles, las validaciones las harías en


los
objetos que invocan directamente a los Storeprocedures, bajo el esquema


Try,
catch Finally.

Te recomiendo trabajar con objetos SqlTransaction, y los objetos Command
como StoreProcedures donde trates los procesos de inserción, actualización


y
borrado a nivel de transacciones y así puedes controlar los errores de
duplicación. o de base de datos.

ejemplo:



public void EjecutarTransaccionSql(string miCadenaConexion)
{
SqlConnection miConexion = new SqlConnection(miCadenaConexion);
miConexion.Open();

SqlCommand myCommand = miConexion.CreateCommand();
SqlTransaction miTransaccion;

// Inicia una transacción local
miTransaccion = miConexion.BeginTransaction();
// Debe asignar ambos objetos el de conexion y el de transacción
// al objeto Comando el cual depende de la transacción local
myCommand.Connection = miConexion;
myCommand.Transaction = miTransaccion;

try
{
//Aquí las transacciones de inserción, actualización o borrado
miTransaccion.Commit(); // Confirma que efectivamente se halla
realizado la transacción,
}
catch(Exception e) //Captura excepciones generales.
{
try
{
miTransaccion.Rollback(); //Le hace RollBack a la transacción si
encuentra alguna transacción
}
catch (SqlException ex) //Captura excepciones de Sql.
{
if (miTransaccion.Connection != null)
{
MessageBox.Show("una Excepción de Tipo" + ex.GetType() + "fue
encontrada mientras se intentaba hacer un roll back a la transacción.");
}
}
MessageBox.Show("Una excepción de tipo " + e.GetType() + " fue
encontrada mientras se intentaba insertar datos.");
MessageBox.Show("Ningun registro fue grabado en la base de datos.");
}
finally
{
miConexion.Close();
}
}

Camilo Villa
APTECH Certified Visual Studio .NET - Microsoft 3 DCE
"Alejandro Bibiano González" escribió en el
mensaje news:u1pID%23r%
> A ver si me explico bien y alguien me puede ayudar con esta questión de
> diseño.
>
> Estoy desarrollando ua aplicación Cliente/Servidor tradicional con
WinForms
> en C#.
>
> Me he creado unos dataset personalizados para cada tabla, así como un
objeto
> que gestiona los inserts, updates y selects.
>
> Por ejemplo, tengo una clase Usuario que tiene métodos para seleccionar,
> insertar y modificar usuarios (siempre a través de un dataset).
>
> En mis formularios uso este objeto para poblar los dataset y actualizar
los
> datos. Hasta aquí todo bastante bien, pero ahora viene mi pregunta.


¿Donde
> hago el control de errores? Por ejemplo, quiero comprobar que no haya 2
> usuarios con el mismo nombre. En la base de datos el campo es "Unique"


por
> lo que mi objeto usuario lanzará una excepción cuando intente actualizar
los
> datos. ¿Debo controlar este error en mi objeto usuario (al haser el


update
> del dataadapter), en el formulario donde hago la actualización, o en


otro
> sitio?
>
> Me gustaría centralizar la detección de errors de base de datos para no
> tener que repetir siempre el mismo código.
>
> Saludos y gracias
>
> Alex Bibiano
>
>


Respuesta Responder a este mensaje
#3 Camilo Villa
24/02/2004 - 16:43 | Informe spam
ya es más una decisión de arquitectura, lo más lógico sería que lo hicieras
en el formulario, y en el objeto que accede a los datos, lo que haces es que
éste devuelva un string con la información del error capturado, en el objeto
que define las reglas del negocio pasas dicho mensaje al formulario que lo
instancia, de acuerdo a lo que venga en este string, se decide si se puede o
no realizar la instrucción, en cuyo caso, este objeto lo que haría sería
devolver un valor booleano. o en fin ya la desición de cómo se haria la
inserción es más una desición personal, basado en la experiencia.

Te recomiendo darle una ojeada a Microsoft DAAB

Salu2

Camilo Villa
APTECH Certified Visual Studio .NET - Microsoft 3 DCE
"Alejandro Bibiano González" escribió en el
mensaje news:OcNmfSu%
Gracias por responder, pero tengo una pregunta acerca de tu propuesta.

Si capturo el error en los objetos que invocan la BD (es el método que


usaba
actualmente), ¿es recomendable que ese mismo objeto haga aparecer un
messagebox con el error?

Es que no tengo muy claro donde hacer aparecer el mensaje de error.
Directamente en la clase que realiza el acceso a datos, o desde el
formulario que usa este objeto para actualizar los datos (en este caso


debo
propagar la excepción).

"Camilo Villa" escribió en el mensaje
news:uc79kvt%
> Si manejas una arquitectura de 3 niveles, las validaciones las harías en
los
> objetos que invocan directamente a los Storeprocedures, bajo el esquema
Try,
> catch Finally.
>
> Te recomiendo trabajar con objetos SqlTransaction, y los objetos Command
> como StoreProcedures donde trates los procesos de inserción,


actualización
y
> borrado a nivel de transacciones y así puedes controlar los errores de
> duplicación. o de base de datos.
>
> ejemplo:
>
>
>
> public void EjecutarTransaccionSql(string miCadenaConexion)
> {
> SqlConnection miConexion = new SqlConnection(miCadenaConexion);
> miConexion.Open();
>
> SqlCommand myCommand = miConexion.CreateCommand();
> SqlTransaction miTransaccion;
>
> // Inicia una transacción local
> miTransaccion = miConexion.BeginTransaction();
> // Debe asignar ambos objetos el de conexion y el de transacción
> // al objeto Comando el cual depende de la transacción local
> myCommand.Connection = miConexion;
> myCommand.Transaction = miTransaccion;
>
> try
> {
> //Aquí las transacciones de inserción, actualización o borrado
> miTransaccion.Commit(); // Confirma que efectivamente se halla
> realizado la transacción,
> }
> catch(Exception e) //Captura excepciones generales.
> {
> try
> {
> miTransaccion.Rollback(); //Le hace RollBack a la transacción si
> encuentra alguna transacción
> }
> catch (SqlException ex) //Captura excepciones de Sql.
> {
> if (miTransaccion.Connection != null)
> {
> MessageBox.Show("una Excepción de Tipo" + ex.GetType() + "fue
> encontrada mientras se intentaba hacer un roll back a la transacción.");
> }
> }
> MessageBox.Show("Una excepción de tipo " + e.GetType() + " fue
> encontrada mientras se intentaba insertar datos.");
> MessageBox.Show("Ningun registro fue grabado en la base de


datos.");
> }
> finally
> {
> miConexion.Close();
> }
> }
>
> Camilo Villa
> APTECH Certified Visual Studio .NET - Microsoft 3 DCE
> "Alejandro Bibiano González" escribió en el
> mensaje news:u1pID%23r%
> > A ver si me explico bien y alguien me puede ayudar con esta questión


de
> > diseño.
> >
> > Estoy desarrollando ua aplicación Cliente/Servidor tradicional con
> WinForms
> > en C#.
> >
> > Me he creado unos dataset personalizados para cada tabla, así como un
> objeto
> > que gestiona los inserts, updates y selects.
> >
> > Por ejemplo, tengo una clase Usuario que tiene métodos para


seleccionar,
> > insertar y modificar usuarios (siempre a través de un dataset).
> >
> > En mis formularios uso este objeto para poblar los dataset y


actualizar
> los
> > datos. Hasta aquí todo bastante bien, pero ahora viene mi pregunta.
¿Donde
> > hago el control de errores? Por ejemplo, quiero comprobar que no haya


2
> > usuarios con el mismo nombre. En la base de datos el campo es "Unique"
por
> > lo que mi objeto usuario lanzará una excepción cuando intente


actualizar
> los
> > datos. ¿Debo controlar este error en mi objeto usuario (al haser el
update
> > del dataadapter), en el formulario donde hago la actualización, o en
otro
> > sitio?
> >
> > Me gustaría centralizar la detección de errors de base de datos para


no
> > tener que repetir siempre el mismo código.
> >
> > Saludos y gracias
> >
> > Alex Bibiano
> >
> >
>
>


Respuesta Responder a este mensaje
#4 Rodrigo Corral González [MVP]
24/02/2004 - 22:58 | Informe spam
A mi el enfoque que me gusta y que puedo asegurarte que funciona muy bien es
tratar las excepciones propias de acceso a datos en la capa de negocio pero
nunca mostrar ninguna interfaz de usuario en esta capa. El principal motivo
de no mostrar interfaz en esta capa es que no sabes donde va a residir, no
tiene por que estar en el cliente donde hay un usuario para responder, sino
que tipicamente estará en un servidor de aplicaciones. Otro motivo es que la
capa de negocio no debe saber nada de la interfaz, supon que muestras un
dialog box, que pasará si un dia quieres que la interfaz de tu aplicación
sea web? o si quieres exponer la funcionalidad de tu aplicación con un Web
Service para facilitar la integración con otro sistema.

En la capa de negocio lo que yo hago es convertir las excepciones propias de
el manejo de datos en excepciones que tengan un significado para mi
aplicación. Por ejemplo si al insertar un registro en una tabla recibo un
error por que la clave primaria esta duplicada yo combierto eso en una
excepción que informa de que el codigo de usuario esta duplicado y luego
cuando la interfaz recibe esta excepción hara lo que tenga que hacer.

Te recomiendo que le heches un vistazo a:

Arquitectura de aplicaciones de .NET: Diseño de aplicaciones y servicios
http://www.microsoft.com/spanish/ms...istapp.asp


Un saludo
Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#5 tzunany
25/02/2004 - 17:44 | Informe spam
Me uno a lo que dice rogrigo.

Lo mejor es que lances una excepción desde la clase cuando
detectes un error.
pej:
Try
{
}
Catch
{
throw new exception("error de acceso a datos");
}

Asi podras usar tu clase en varios tipos de aplicaciones
sin ataduras.

Un saludo
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida