Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Error transaccion en sql srver 2000

Estas en el tema de Error transaccion en sql srver 2000 en el foro de SQL Server en Foros del Web. Hola, como estan? Estoy realizando una TRANSACCION en SQL 2000, intento ingresar datos en una tabla ARTICULOS y que si los datos se validan correctamnte, ...
  #1 (permalink)  
Antiguo 05/08/2008, 17:29
Avatar de alterWM  
Fecha de Ingreso: diciembre-2005
Mensajes: 8
Antigüedad: 18 años, 4 meses
Puntos: 0
Exclamación Error transaccion en sql srver 2000

Hola, como estan?

Estoy realizando una TRANSACCION en SQL 2000, intento ingresar datos en una tabla ARTICULOS y que si los datos se validan correctamnte, lo haga, sino, ke haga el rollback y salga el aviso.

el codigo SQL es este:

Código:
declare 
	@id_familia int,
	@codigo int,
	@nombre nvarchar (75),
	@marca nvarchar(75),
	@detalles nvarchar(75),
	@precio int,
	@pack int,
	@fotoarticulo nvarchar (75),
	@modelo nvarchar (50)


set @id_familia = 6
set @codigo = 146
set @nombre = 'jm'
set @marca = 'jm'
set @detalles = 'jm'
set @precio = 12
set @pack = 1
set @fotoarticulo = 'jpg'
set @modelo = 'jm'

BEGIN TRANSACTION 

	INSERT INTO articulos
		(id_familia, codigo, nombre, marca, detalles, precio, pack, fotoarticulo, modelo )
		VALUES
	(@id_familia, @codigo, @nombre, @marca, @detalles, @precio, @pack, @fotoarticulo, @modelo )

/* Confirmamos la transaccion*/
COMMIT TRANSACTION
    PRINT 'TRANSACCION OK!'

/* Hay un error, deshacemos los cambios*/
ROLLBACK TRANSACTION -- O solo ROLLBACK

    PRINT 'Se ha producido un error!'


El codigo que genere, funciona, inserta datos, pero me da un error:


Código:
(1 row(s) affected)

TRANSACCION OK!
Server: Msg 3903, Level 16, State 1, Line 35
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.
Se ha producido un error!
Como veran, se realiza la transaccion, pero esta esto del:

"Server: Msg 3903, Level 16, State 1, Line 35
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.
Se ha producido un error!"


Por favor les pido, algo esta quedando abierto o no se, pero realmente agradecere su ayuda.
  #2 (permalink)  
Antiguo 06/08/2008, 05:06
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Error transaccion en sql srver 2000

Hola,

Hay varios problemas, pero el mas grave es la falta de capacidad del parser de SQL Server 2000 para generar un RAISE. En estos casos lo que tienes que hacer es preguntar por la variable @@ERROR (teniendo en cuenta que su valor cambia con cada ejecucion de una sentencia SQL), si es igual a 0, commit, y si es diferente de 0, rollback. Por ejemplo,

Código:
begin tran
  insert
if @@error = 0
  commit tran
else
  rollback tran
De esta manera, solo se ejecuta un fin de transaccion.

Ahora bien, sigamos adelante, estoy suponiendo que el codigo posteado es solo un ejemplo, dado que no tiene sentido poner dentro de una transaccion explicita una sola sentencia SQL, para esto puedes leer el concepto de Atomicidad y mas importante, como es su implementacion en SQL Server.

Por ultimo, y esto es a modo de sugerencia dado que pocas veces podemos decidir con que motor de base de datos vamos trabajar, te recomiendo SQL Server 2005, donde (era hora) se implementa el concepto de TRY / CATCH y el parser se encarga de los RAISE, por ejemplo

Código:
begin try
 begin tran
   insert 1
   insert 2
   update 1
   delete 1
 commit tran
end try
begin catch
  rollback tran
end catch
Saludos
  #3 (permalink)  
Antiguo 06/08/2008, 06:50
Avatar de alterWM  
Fecha de Ingreso: diciembre-2005
Mensajes: 8
Antigüedad: 18 años, 4 meses
Puntos: 0
Exclamación Respuesta: Error transaccion en sql srver 2000

Hola Matanga! muchas gracias por tu respuesta!

Relize una estructura para la transaccion como la siguiente:

Código:
DECLARE @Error int,
	@id_familia int,
	@codigo int,
	@nombre nvarchar (75),
	@marca nvarchar(75),
	@detalles nvarchar(75),
	@precio int,
	@pack int,
	@fotoarticulo nvarchar (75),
	@modelo nvarchar (50)
--Declaro una variable que utilizaro para almacenar un posible código de error
set @id_familia = 3
set @codigo = 146
set @nombre = 'jm'
set @marca = 'jm'
set @detalles = 'jm'
set @precio = 12
set @pack = 1
set @fotoarticulo = 'jpg'
set @modelo = 'jm'
SET @Error=@@ERROR
BEGIN TRAN
--Inicio la transacción
INSERT INTO articulos
		(id_familia, codigo, nombre, marca, detalles, precio, pack, fotoarticulo, modelo )
		VALUES
	(@id_familia, @codigo, @nombre, @marca, @detalles, @precio, @pack, @fotoarticulo, @modelo )
--Ejecuto la transaccion

--Si ocurre un error almaceno su código en @Error
--y salteo al código que deshace la transacción.

IF (@Error<>0) GOTO TratarError


COMMIT TRAN

TratarError:
--Si ocurrio un error llegamos hasta aca
If @@Error<>0
	BEGIN
	PRINT 'Ha ecorrido un ERROR. Abortamos la transacción'
--Seshacemos la transacción
	ROLLBACK TRAN
	END
y aparentemente funciona, digo aparente mente, por que si ingreso valores correctos, genera el tipico:
Código:
(1 row(s) affected)
Pero si al ingresar un dato no valisdo, ejemplo una letra "A" en un campo de valor int, aparece lo siguiente:

Código:
Server: Msg 207, Level 16, State 3, Line 12
Invalid column name 'A'.
DEbo hacerlo en SQL 2000, ya que esta todo el desarrollo echo en esta tecnologia, lo tendre en cuenta para el proximo proyeto, Por favor, necesito su ayuda!
  #4 (permalink)  
Antiguo 06/08/2008, 07:45
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Error transaccion en sql srver 2000

Hola,

Empieza por leer esto http://msdn.microsoft.com/es-es/libr...s,SQL.80).aspx hay varios ejemplos de como utilizar la variable @@ERROR.

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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:09.