Foros del Web » Programación para mayores de 30 ;) » .NET »

¿Transacción para llamar a varios procedimientos almacenados?

Estas en el tema de ¿Transacción para llamar a varios procedimientos almacenados? en el foro de .NET en Foros del Web. Buenas... Tengo una función en c# para eliminar a un usuario con perfil de administrador de la base de datos. Pero al eliminar a ese ...
  #1 (permalink)  
Antiguo 08/02/2005, 11:26
 
Fecha de Ingreso: agosto-2004
Mensajes: 37
Antigüedad: 20 años, 7 meses
Puntos: 0
Pregunta ¿Transacción para llamar a varios procedimientos almacenados?

Buenas...

Tengo una función en c# para eliminar a un usuario con perfil de administrador de la base de datos. Pero al eliminar a ese tipo de usuario, se tienen que llevar a cabo otra serie de acciones, como por ejemplo, eliminar las "relaciones" de ese usuario con otros módulos, dar de alta a otro usuario para que ocupe el lugar de administrador, etc... y claro, todas estas acciones se tienen que hacer o todas o ninguna de tal forma que si falla una se pudieran "deshacer" los cambios hechos por las otras.

Todas estas operaciones individuales de acceso/modificación de la base de datos las tengo hechas mediante "procedimientos almacenados" (una para eliminar al usuario, otra para eliminar las relaciones con los módulos, otra para dar de alta a otro usuario, etc) y lo que hago es en la función de c# llamar uno tras otro a estos procedimientos... pero, ¿cómo puedo controlar que si falla uno de estos procedimientos, se deshagan los cambios realizados por los otros? ¿Hay alguna forma de hacer una transacción al conjunto de todas estas llamadas a procedimientos almacenados?

Gracias por la ayuda...
  #2 (permalink)  
Antiguo 08/02/2005, 13:31
 
Fecha de Ingreso: marzo-2004
Mensajes: 198
Antigüedad: 21 años
Puntos: 1
por lo que yo se una transaccion es una serie de sentencias que tienen exito o fracasan como un todo.
Microsoft sql soporta begin transaction, commit transaction, y rollback transaction.

Ado.net soporta transacciones a traves de las clases connection y transaction. Podemos crear una transaccion nueva con el metodo beginTransaction de la clase connection. Despues se puede asociar a la transaccion con multiples comandos mediante la propiedad transaction de la clase command.

conback es la conexion

objTransaction = conBack.BeginTransaction
cmdupdateAccounta.transaction = objTransaction
cmdupdateAccountB.transaction = objTransaction
try
cmdUpdateAccountA.ExecuteNonQuery()
cmdUpdateAccountB.ExecuteNonQuery()
objTransaction.Commit
Response.write ( Transaction con exito" )
Catch ex as Exception
objTransaction.rollback
response.write( "transacion Fallida")
Finally
conback.close()
end Try

Sin faltas de ortografia esto actualizaria dos cuentas bancarias o si falla no actualiza ninguna.

espero te sirva.
  #3 (permalink)  
Antiguo 09/02/2005, 02:36
 
Fecha de Ingreso: agosto-2004
Mensajes: 37
Antigüedad: 20 años, 7 meses
Puntos: 0
Pregunta Sí... pero...

Hola de nuevo...

Gracias por responderme, pero exactamente no es eso lo que ando buscando.

Originalmente yo lo tenía como lo pones tú, con las sentencias sql directamente en el código c# y tratando ahí las transacciones, pero luego leyendo en manuales y demás decían que los procedimientos almacenados (crear las sentencias sql directamente en la base de datos (microsoft sql server) y llamarlas desde la aplicación de c#) es mucho mejor.

Pero claro, ¿se puede hacer esto mismo de las transacciones con llamadas a diferentes funciones (cada una asociada a un procedimiento almacenado=sentencia sql) en vez de con las llamadas directas a instrucciones sql como pones en tu respuesta?

Gracias de nuevo
  #4 (permalink)  
Antiguo 09/02/2005, 09:42
 
Fecha de Ingreso: marzo-2004
Mensajes: 198
Antigüedad: 21 años
Puntos: 1
pos no sabria decirte...

si fuese gallego te diria que quizass.

;:)
  #5 (permalink)  
Antiguo 09/02/2005, 10:20
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 23 años, 1 mes
Puntos: 50
No he visto exactamente el tipo de queries que estas usando pero lo que yo hago es colocar mis insert, updates, etc en un solo storeprocedure, claro que siempre y cuando esten relacionados , todo depende.

Y ya por código hago algo como ésto:

Cita:
....
...
oConn.Open();
trans = oConn.BeginTransaction();
try
{
...
...
myComand.ExecuteNonQuery();
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
}
finally
{
if (oConn.State == ConnectionState.Open)
oConn.Close();
}
Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #6 (permalink)  
Antiguo 09/02/2005, 13:02
 
Fecha de Ingreso: agosto-2004
Mensajes: 37
Antigüedad: 20 años, 7 meses
Puntos: 0
Si... pero (bis)

Buenas de nuevo...

No puedo colocar todas las insert, updates, etc en el mismo storeprocedure
porque no todas esas operaciones se llevan a cabo siempre que se ejecute el storeprocedure, depende de diversas condiciones que si se cumplen se hacen unas y si no otras, por lo que sería "marear mucho la perdiz" introducir todo en un mismo storeprocedure.
Además, me sirvo de una estructura "modular en capas" (capa de negocios y capa de datos para cada uno de los módulos de la aplicación), donde las funciones de la capa de datos (son las que llaman directamente a los storeprocedure para que la capa de negocios "no sepa nada" de los accesos a los datos) utilizan otras clases base que vienen haciendo lo siguiente:

EjecutarProcedimientoXXX
conexion.Open(); //conexion es el objeto sqlConnection
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = ConstruirConsultaCommand(procAlmacenado, parametros);
sqlDA.Fill(dataSet, tabla);
conexion.Close();

ConstruirConsultaCommand
SqlCommand command = new SqlCommand(procAlmacenado, conexion);
command.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter parametro in parametros)
command.Parameters.Add(parametro);
return command;

Entonces, claro, es en la capa de negocios donde llamo a las diferentes funciones de la capa de datos según las condiciones que se vayan dando y es en esta capa de negocios donde quiero "controlar" que se hagan todas (si no hay fallos) o ninguna (si surge algún fallo).

¿Puedo hacer "transacciones" (o algo similar) para controlar esto en la capa de negocios?

Y como tampoco soy gallego... ó ... menudo lío, ¿no?
  #7 (permalink)  
Antiguo 19/05/2005, 09:37
Avatar de davidbravof  
Fecha de Ingreso: febrero-2005
Mensajes: 13
Antigüedad: 20 años, 1 mes
Puntos: 0
Hola gente como estan,

Bueno sobre lo q he podido entender al trabajar en capas lo que buscas es abstraer el acceso a datos, pues bien la funcionalidad del ejecutar las sentencias segun entiendo debe de estar encapsulada en algun objeto no?

Lo que yo hago es usar una funcion que solicita un arrray de strings q contienen sentencias Inset, update, delete, o exe de stores y devuelve un bool yndicando si se eejecuto satisfactoriamente o no

La funcion es como sigue


Código:
 
Public Function EjecutaComando(ByVal sql() As String) As Boolean
        'Ejecuta una sentencia insert, update o delete segun el query
        Dim cn As SqlConnection = RetornaConexion()
        Dim comm As New SqlCommand
        Dim _transaction As SqlTransaction
        Dim i As Integer

        _transaction = cn.BeginTransaction()
        comm = New SqlCommand(sql(0), cn)
        comm = cn.CreateCommand
        comm.Connection = cn
        comm.Transaction = _transaction

        For i = 0 To sql.Length
            If i = 0 Then cn.Open()
            Try
                comm.CommandText = sql(i)
                comm.ExecuteNonQuery()
                If i = sql.Length Then _transaction.Commit()
            Catch ex As Exception
                _transaction.Rollback()
               'Seria genial si aqui implementara un metodo 
               'que reporte el error en
               'el visor de sucesos no?
                Return False
            Finally
                If i = sql.Length Then cn.Close()
            End Try
        Next
        cn.Close()
        Return True
  End Function


De este modo en mi capa de negocio acumulo las sentencias q deseo ejecutar ya sea en una sentencia sql o llamando a un store como gustes y luego envio todas las sentencias a ejecutarce si fallara obtendre un false.

Bueno es como pienso q podria ser , pero nadie es dueño de la verdad, asi q espero sus comentarios para mejoras o q no deberia hacer , ademas de haber contribuido en algo.

Saludos!!!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:42.