Transacciones y clases

25/09/2007 - 18:00 por jcpc91 | Informe spam
hola espero me puedan ayudar

tengo varias clase por ejemplo

Clase1, Clase2, Clase3, etc

cada una de las clases tiene un método llamado agregar() que ejecuta
un procedimiento almacenado que guarda en los datos almacenadas en sus
propiedades en una tabla y asi cada una de esas clase tiene un método
agregar() que es el que se encarga de guardar en la base de datos la
información contenida en sus propiedades.

ahora lo ke no sé es como haría el manejo de transacciones desde .net
porke lo ke kiero es iniciar la transacción desde la Clase1 es decir

public bool agregar(){

clase2.agregar(); /*cada una de estas son varibles de
instancia de una clase "X"
clase3.agregar(); /*y cada una de los métodos de guardar
ejecutan un procedimiento almacenado
clase4.agregar(); /* que guarda en la base de datos

}

lo ke kiero controlar es la transacción desde el cliente osea con .net
y no desde el procedimiento almacenado he estado leyendo algo pero
tengo muchas dudas como:

1. si cada uno de los métodos agregar() de las clases deben iniciar y
mantener una conexión con la base de datos he iniciar la transacción

2. en la web del guille encontré un código que resa como se ve abajo
pero

Dim Conn As SqlConnection = New SqlConnection("cadenadeconexion")
Conn.Open()
Dim myTrans As SqlTransaction
Dim Comando As SqlClient.SqlCommand
myTrans = Conn.BeginTransaction()
Try
Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo,
nombres, sueldo, estado) Values('tr1','JOSE',200,'A')", Conn)
Comando.Transaction = myTrans
Comando.ExecuteNonQuery()
Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo,
nombres, sueldo, estado) Values('tr2','LUIS',180,'B')", Conn)
Comando.Transaction = myTrans
Comando.ExecuteNonQuery()
Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo,
nombres, sueldo, estado) Values('tr3','PEDRO',400,'A')", Conn)
Comando.Transaction = myTrans
Comando.ExecuteNonQuery()
myTrans.Commit()
MsgBox("Datos Ingresados")
Catch ex As Exception
myTrans.Rollback()
MsgBox(ex.Message)
End Try
Conn.Close()



viendo lo anterior kisiera hace algo como esto en mi aplicación pero
no Žse como

public class Clase1
private Clase2 clase2;
private Clase3 clase3;
private Clase4 clase4;


public bool agregar(){
try{
this.clase2.agregar(); /*cada una deberia ser una
transaccion
this.clase3.agregar(); /*en caso de que falle una se
deberián cancelar todas las transacciones
this.clase4.agregar();
}catch(Exception ex){
//*hacer el rollback si falló
}
}

espero le hayan entendido y gracias por sus respuestas y asesoramiento
 

Leer las respuestas

#1 Alberto Poblacion
25/09/2007 - 18:58 | Informe spam
Bien, lo que quieres hacer se puede hacer de varias formas, pero una de las
que quizás te cueste menos es esta:

Crea una clase separada para manejar las conexiones y las transacciones.
Donde dices que "cada uno de los métodos agregar() de las clases deben
iniciar y mantener una conexión", tienes que tener presente que para que
todas las operaciones formen parte de una transacción, tienen que tener
lugar a través de la misma conexión. Por lo tanto, lo que vas a hacer es que
esa clase independiente sea la que cree y abra la conexión, y luego cada uno
de los métodos llaman a esa clase para obtener la conexión (siempre la
misma, no se abre ni cierra hasta que acabe la transacción).

Esa misma clase también hará el BeginTransaction sobre la conexión, y
devolverá el objeto Transaction a todos los métodos que tengan que hacer
operaciones dentro de la transacción. De esa forma, estos métodos pueden
conectar ese transaction a los objetos Command que estén usando para
comunicarse contra la base de datos.

Finalmente, cuando esté completa la transacción, habrá que hacer una llamada
al Commit del objeto Transaction y cerrar la conexión si ya no se necesita
más. Puede ser bueno encapsular esta funcionalidad en la misma clase que
sirve las conexiones y las transacciones.

Habrá que llevar cierta lógica de control de tal modo que si alguno de los
módulos hace un rollback no se sigan intentando ejecutar los demás.

Si no quieres hacer todo esto manualmente, puedes recurrir a los
System.EnterpriseServices, que te permiten instalar tu aplicación dentro de
COM+ y usar los servicios de transacciones de los Servicios de Componentes
de windows. Esto te permite "conectar" todos los métodos que quieras dentro
de una transacción solo con que los "decores" con unos cuantos atributos en
tu código fuente.


wrote in message
news:
hola espero me puedan ayudar

tengo varias clase por ejemplo

Clase1, Clase2, Clase3, etc

cada una de las clases tiene un método llamado agregar() que ejecuta
un procedimiento almacenado que guarda en los datos almacenadas en sus
propiedades en una tabla y asi cada una de esas clase tiene un método
agregar() que es el que se encarga de guardar en la base de datos la
información contenida en sus propiedades.

ahora lo ke no sé es como haría el manejo de transacciones desde .net
porke lo ke kiero es iniciar la transacción desde la Clase1 es decir

public bool agregar(){

clase2.agregar(); /*cada una de estas son varibles de
instancia de una clase "X"
clase3.agregar(); /*y cada una de los métodos de guardar
ejecutan un procedimiento almacenado
clase4.agregar(); /* que guarda en la base de datos

}

lo ke kiero controlar es la transacción desde el cliente osea con .net
y no desde el procedimiento almacenado he estado leyendo algo pero
tengo muchas dudas como:

1. si cada uno de los métodos agregar() de las clases deben iniciar y
mantener una conexión con la base de datos he iniciar la transacción

2. en la web del guille encontré un código que resa como se ve abajo
pero

Dim Conn As SqlConnection = New SqlConnection("cadenadeconexion")
Conn.Open()
Dim myTrans As SqlTransaction
Dim Comando As SqlClient.SqlCommand
myTrans = Conn.BeginTransaction()
Try
Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo,
nombres, sueldo, estado) Values('tr1','JOSE',200,'A')", Conn)
Comando.Transaction = myTrans
Comando.ExecuteNonQuery()
Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo,
nombres, sueldo, estado) Values('tr2','LUIS',180,'B')", Conn)
Comando.Transaction = myTrans
Comando.ExecuteNonQuery()
Comando = New SqlClient.SqlCommand("INSERT INTO PERSONA (codigo,
nombres, sueldo, estado) Values('tr3','PEDRO',400,'A')", Conn)
Comando.Transaction = myTrans
Comando.ExecuteNonQuery()
myTrans.Commit()
MsgBox("Datos Ingresados")
Catch ex As Exception
myTrans.Rollback()
MsgBox(ex.Message)
End Try
Conn.Close()



viendo lo anterior kisiera hace algo como esto en mi aplicación pero
no Žse como

public class Clase1
private Clase2 clase2;
private Clase3 clase3;
private Clase4 clase4;


public bool agregar(){
try{
this.clase2.agregar(); /*cada una deberia ser una
transaccion
this.clase3.agregar(); /*en caso de que falle una se
deberián cancelar todas las transacciones
this.clase4.agregar();
}catch(Exception ex){
//*hacer el rollback si falló
}
}

espero le hayan entendido y gracias por sus respuestas y asesoramiento

Preguntas similares