Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-04-2006
mpedra mpedra is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires (Arg)
Posts: 19
Poder: 0
mpedra Va por buen camino
Problema con excepsión y transacción

Hola

Estoy con un problemita de excepciones que no se si es propio de esta sección del foro, pero como esto me ocurre con SQL Server, es posible que alguien ya halla lidiado con el.
Al grano;

Una aplicacion multiusuario (Delphi 5 BDE y SQL Server 2000) realiza bloqueos de registro según este esquema:

Se inicia una transacción.
Se ejecuta la consulta de bloqueo.
Se edita....


El problema que estoy teniendo es en la captura de la excepción que se produce cuando intento bloquear un registro ya bloqueado por otro usuario.
La exepción es capturada pero la transacción es concluída por ¿el BDE?.

¿Existe alguna forma de mantener viva la transacción mas allá de una excepción?

Desde ya muchas gracias.

Salu2
__________________
Marcos
Responder Con Cita
  #2  
Antiguo 11-04-2006
alapaco alapaco is offline
No confirmado
 
Registrado: jun 2003
Ubicación: Buenos Aires
Posts: 287
Poder: 0
alapaco Va por buen camino
En que instrucción te da error ?
Responder Con Cita
  #3  
Antiguo 11-04-2006
mpedra mpedra is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires (Arg)
Posts: 19
Poder: 0
mpedra Va por buen camino
Cita:
Empezado por alapaco
En que instrucción te da error ?
Hola,

En la base tengo:
LOCK_TIMEOT =3000

Las aplicaciones bloquean registros mediante un stored procedure.

Supongamos dos instancias de la aplicacion.
La primera bloquea el registro y comienza a editarlo.

Cuando la 2da intenta bloquear el mismo reg que en la 1ra instancia se produce una excepción. Teoricamente el código NativeError es 1222.

Mi problema es que al capturar la excepción la transacción todavia sigue activa, pero al salir del try except ya no.

==> Aqui esta el procedimiento en donde se captura la excepción:

procedure TForm1.btnEditarClick(Sender: TObject);
begin
//Llama a editar un registro
with qryModif do
begin
close;
ParamByName('pID').Value:=catCalif.fieldByName('ID').value;
ParamByName('pActualiza').Value:=1;
try
open;
except on E:EDatabaseError do
begin
ManejarErrorBloqueo(qryModif,E);
MessageDlg('El registro que desea editar, está siendo util'+
'izado por otro usuario. '+#13+#10+'Por favor i'+
'ntente la operación nuevamente mas tarde.',
mtError, [mbOK], 0);
end;
end;
end;
end;

La transacción fue iniciada antes, y lo que necesito es que apesar del error de bloqueo ésta continue viva.
__________________
Marcos
Responder Con Cita
  #4  
Antiguo 11-04-2006
alapaco alapaco is offline
No confirmado
 
Registrado: jun 2003
Ubicación: Buenos Aires
Posts: 287
Poder: 0
alapaco Va por buen camino
Y en la función ManejarErrorBloqueo haces algo con la base de datos ?
Responder Con Cita
  #5  
Antiguo 11-04-2006
mpedra mpedra is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires (Arg)
Posts: 19
Poder: 0
mpedra Va por buen camino
Procedure TForm1.ManejarErrorBloqueo(Dataset:TDataset;E:EDatabaseError);
var
I: Integer;
x: String;
begin
if Database1.InTransaction then
MessageDlg('Todavia estoy en la transaccion', mtWarning, [mbOK], 0);
if E is EDBEngineError then
with EDBEngineError(E) do
for I := 0 to ErrorCount - 1 do
if Errors[i].NativeError <> 0 then
begin
X := X+inttostr(Errors[i].NativeError)+#13+#10;
Exit;
end;

MessageDlg(''+X, mtError, [mbOK], 0);


end;

El messageDlg que me informa que todavia estoy dentro de la transaccion me lo muestra, osea que alli todavia está la transacción en funcionamiento.

Despues de mostrar los errores, hago un rollback y me da este error:
No user transaction is currently in progress.
...
__________________
Marcos
Responder Con Cita
  #6  
Antiguo 11-04-2006
alapaco alapaco is offline
No confirmado
 
Registrado: jun 2003
Ubicación: Buenos Aires
Posts: 287
Poder: 0
alapaco Va por buen camino
Es como si al haber un error te hiciera automaticamente un rollback o un commit (esto último poco probable) por default.
Tal vez este seteado así en los componentes de base de datos, cuales usas ?
Responder Con Cita
  #7  
Antiguo 11-04-2006
mpedra mpedra is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires (Arg)
Posts: 19
Poder: 0
mpedra Va por buen camino
TDatabase para la conexion
TQuery...

BDE
__________________
Marcos
Responder Con Cita
  #8  
Antiguo 11-04-2006
alapaco alapaco is offline
No confirmado
 
Registrado: jun 2003
Ubicación: Buenos Aires
Posts: 287
Poder: 0
alapaco Va por buen camino
La propiedad KeepConnection del TDatabase está en True ?
Responder Con Cita
  #9  
Antiguo 11-04-2006
mpedra mpedra is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires (Arg)
Posts: 19
Poder: 0
mpedra Va por buen camino
Si está en true

Aparentemente la instancia de TDabase1 permance dentro de la transaccion fuera del try except donde capturo el error. (ya que hago un Database1.Intransaction y me da true). Pero si hago un commit o un rollback me da el error de que no tengo transaccion activa.
__________________
Marcos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con transaccion con IB reina Varios 2 03-09-2005 02:40:11
Urgente - problema de insertar en tabla - Transaccion Activa Patricio Conexión con bases de datos 2 27-06-2005 16:29:06
Confilcto en Transaccion muli Firebird e Interbase 2 24-09-2004 16:33:26
Transaccion Esau SQL 1 14-01-2004 10:00:34
La vista de una transacción Newbie Firebird e Interbase 1 08-09-2003 09:35:47


La franja horaria es GMT +2. Ahora son las 15:39:41.


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
Copyright 1996-2007 Club Delphi