Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problema con transaccion en SQL server (https://www.clubdelphi.com/foros/showthread.php?t=38336)

JuanchoArg 11-12-2006 23:38:35

Problema con transaccion en SQL server
 
Tengo un problema al correr una transaccion en SQL server desde una componente Adoquery. No me detecta el error si no es en la ultima linea sql que envio dentro de la transaccion. Incluso la transaccion inserta todas la lineas sin error aunque se haya provocado un error en una linea previa. Asi armo la transaccion

Código SQL [-]
 
Begin Tran
 
--sql1...
--sql2...
 
if @@error <> 0
rollback tran
Else
commit tran

Por lo que veo @@error solo detecta el error si se produce en la ultima linea, sino lo deja pasar y no hace el rollback tran. Como hago para que detecte errores en cualquier parte de la transaccion y pueda manejarlo con dentro de un
Código Delphi [-]
try except end
desde delphi. Cualquier tipo de ayuda se las agradeceria. Saludos.

poliburro 11-12-2006 23:54:02

Si en bloque transaccional vas a ejecutar varias sentencias de acción (borrado, inserció o acutalización) debes comprobar el valor de @@ERROR al final de cada una de ellas.

Tu bloque debe quedar así

Código SQL [-]

Begin Tran
 
--sql1...
if @@error <> 0
  Begin
     rollback tran
     GOTO: MANEJADORERROR
  End 
--sql2...
if @@error <> 0
  Begin
     rollback tran
     GOTO: MANEJADORERROR
  End
commit tran

--Termina el Sp
Return

MANEJADORERROR:
  RaiseError(--notificación de error a nivel de sistema)

Suerte

JuanchoArg 13-12-2006 22:59:37

Sigo con problemas en la transaccion
 
Ke tal amigo? agradezco la ayuda que me diste. Pero aun tengo un problema, no se porque motivo un insert con clave duplicada no genera error al correr el adoquery. En el analizador de consulta da el error pero delphi no lo detecta. y me serviria que me devuelva un error si algo no anduvo bien en la transaccion.
Asi quedo la transaccion que corro.

Código SQL [-]
 
BEGIN TRAN
insert into croperatoria (idoperatoria,fecha) values ('000500000012','2006-12-13');
if @@error <>0 begin  rollback tran; RETURN; end;
insert into cuentas (nro_cuenta,lim_cred,cred_utiliz, estado, est_aval,fec_alta) values ('00025001',250,0,'Habilitado','','2006/12/13')
if @@error <>0 begin  rollback tran; RETURN; end;
...
...
...
commit tran


Usé tambien el RAISERROR para que me devuelva un mensaje de error como me explicaste antes, pero no hay forma de que delphi lo detecte o yo no se como hacer para detectarlo. ASi es el codigo en delphi.

Código Delphi [-]
 
fmain.adoq.SQL.Clear;
fmain.adoq.SQL.LoadFromFile(files);
ok:=true;
estado:='OK';
try
res:=fmain.ADOq.ExecSQL;
except
estado:='FALLO';
ok:=false;
end;
Si me ayudas de nuevo te lo agradeceria.

Saludos


La franja horaria es GMT +2. Ahora son las 22:47:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi