Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: PatriciaBB en Julio 19, 2016, 08:01:35 pm
-
Chicos… SoS… estoy tratando de manejar transacciones dentro del manejo de mis actualizaciones de datos, pero me surge la siguiente duda
1. La transacción la debo de abrir y controlar desde VB
2. La transacción la debo de abrir y controlar dentro de un procedimiento almacenado al que le enviaría todos los datos como parámetro
Cuál es la mejor práctica que se debe de aplicar.
Graciassssss....
-
1.- Si
2.- No, la invocación y uso del procedimiento almacenado también debe estar dentro de la transacción.
Saludos
-
Hola, en mi caso, yo las controlo dentro del procedimiento.
Por ej un procedimiento Actualizar Stock, dentro del mismo abro el begin tran, hago lo que tengo que hacer, si salió todo bien... Commit, falló algo Rollback, si hice Rollback dentro del procedimiento genero un RaiseError, para que Vb se entere que hubo error.
Ah ojo, siempre hablando de Ms Sql
-
Hola estimado Waldo, no me queda claro si con la palabra "procedimiento" te refieres a un Stored Procedure (procedimiento almacenado) a un Sub de VB6.
En todo caso insisto que el inicio/fin/excepción de una transacción la realizo desde fuera del Stored Procedure, es decir, esas lineas están escritas en el aplicativo que invoca la(s) transaccion(es).
Al margen de si esta bien o no, en mi caso particular y así quisiera no podría meter un commit/rollback dentro de un Stored Procedure, no se como será en los otros motores pero en Firebird no se puede finalizar (commit/rollback) una transacción desde dentro de un Stored Procedure, debe finalizarse desde fuera.
Saludos
-
Hola Ivan, me referia a un stored procedure. En Sql server, directamente dentro del sp podes controlar las transacciones. Como siempre debe haber pros y contras. La verdad nunca tuve problemas hasta ahora haciéndolo así.
-
Ok, tomé nota de esto como una restricción de Firebird.
Saludos
-
Yo realizo el control de las Transacciones de MSSQL desde VB Usando ADODB. Es mucho mas amplio manejar varios SP y al final si encuentras un error realizar el RollBack
Ejemplo sencillo usando una Trans. con ADODB
Dim cn As ADODB.Connection '//Conexion al DB
cn.Open "Provider=SQLOLEDB.1;password = 1234. ;User ID=SA ;Initial Catalog=...."
cn.BeginTrans '-->INICIA LA TRANSACCION
Dim oCmd As New ADODB.Command
Set oCmd.ActiveConnection = cn
oCmd.CommandText = "EXEC SP_PRUEBA @ParamAccion='INSERTAR'; EXEC SP_PRUEBA @ParamAccion='ACTUALIZAR';"
oCmd.CommandType = ADODB.adCmdText
'-->Ejectuando
oCmd.Execute
If cn.Errors.Count = 0 Then '--> Valida si contiene Errores
cn.CommitTrans '--> Completa la Accion
Else
cn.RollbackTrans '--> Revierte la Accion
End IF
cn.Close
Luego puedes crear una clase mas completa llamada SQLACCESS o como gustes. Que realiza multiples acciones o tambien para agilizar tiempos, por ejemplo
Dim dba as new SQLACCESS
With dba
.IniciarTrans
.EJecutarQuey("INSERT INTO TABLA(Field) VALUES(1);")
.EJecutarQuey("INSERT INTO TABLA(Field) VALUES(2);")
.EJecutarQuey("INSERT INTO TABLA(Field) VALUES(3);")
.EJecutarQuey("INSERT INTO TABLA(Field) VALUES(4);")
.EJecutarSP("PA_PRUEBA","Param='ACTUALIZAR_SALDO'")
If .ConErrores= True Then
.TerminarTrans= 0 '0=RollBack
Else
.TerminarTrans= 1 '1=Commit
End If
End With
Set dba = Nothing
Saludos :)
-
YAcosta, Waldo, Karman12... muchas gracias por vuestro tiempo y por compartir muestra de su código.
Dado que de los tres, dos se inclinan por controlarlo desde el código VB intentare de dicha manera. Ya pronto les comentare mis resultados.
Mil... Gracias :)
Ya le di sus puntitos...