PDA

Ver la Versión Completa : Al llamar a ApplyUpdate(0) de un ClientDataSet la aplicación se cuelga


lmhjob
03-09-2008, 11:01:57
Hola a todos, estoy trabajando en una aplicación desarrollada en Delphi 5 que en un bucle actualiza 4 tablas de una bbdd sql server 2000. Para operar con las tablas utilizo ClientDataSet de MIDAS. Como provider utilizo un ADOQuery. Pues bien, la aplicación se quedaba colgada aleatoriamente en una de las iteraciones del bucle. Depurando descubrí que el trap se producía en la instrucción ApplyUpdate(0) de una de las 4 tablas. Antes del bucle creo y abro los ClientDataSet. En cada iteración hago un post de los cambios y el ApplyUpdate correspondiente a cada una de las 4 tablas y después del bucle cierro y destruyo. Haciendo pruebas he logrado llegar al punto de descubrir que es sólo un campo de una de las tablas el que hace que se cuelgue todo. Es un campo de tipo texto de la base de datos que contiene lo que sería el texto html de un email. Esto me ha hecho pensar que el problema debe ser de falta de recursos o de buffers. He buscado mucho al respecto pero no logro encontrar nada documentado al respecto. Hay alguna operación para liberar los recursos (aunque yo creia que el propio ApplyUpdates lo hacia...)????
Si al menos me diera una excepción o algo, el principal problema es que simplemente se queda colgado sin más información :(. Por favor, si alguien sabe algo de esto puede echarme un cable?? estoy un poco perdida con esto :p

coso
03-09-2008, 15:10:34
hola, se te queda colgado en una funcion, en el servidor sql o en el bucle?

lmhjob
03-09-2008, 15:26:57
Hola, depurando paso a paso el momento en que se cuelga es justo cuando entra en la llamada ApplyUpdates dentro de una de las iteraciones del bucle (nunca es la misma) y ya no sale nunca. Te pego un trozo del código:


[...]
TblEml->Insert();
TblEml->Fields->Fields[ APP ]->AsString = ModlCode;
TblEml->Fields->Fields[ OPC ]->AsString = "ENTI";
TblEml->Fields->Fields[ FRA ]->AsString = SmtpFrom;
TblEml->Fields->Fields[ FRN ]->AsString = "SECCION";
TblEml->Fields->Fields[ RPL ]->AsString = SmtpFrom;
TblEml->Fields->Fields[ TOA ]->AsString = emlAlm;
TblEml->Fields->Fields[ TCC ]->AsString = "";
TblEml->Fields->Fields[ TBC ]->AsString = "";
TblEml->Fields->Fields[ FCH ]->AsDateTime = TS;
TblEml->Fields->Fields[ TIT ]->AsString = "título del mail";
TblEml->Fields->Fields[ MSG ]->AsString = HtmlText;
TblEml->Fields->Fields[ NAT ]->AsInteger = 0;
TblEml->Fields->Fields[ ATN ]->AsString = "";
TblEml->Fields->Fields[ ATD ]->AsString = "";
TblEml->Fields->Fields[ STP ]->AsString = "H";
TblEml->Fields->Fields[ CNF ]->AsString = "";
TblEml->Fields->Fields[ HPR ]->AsString = "";
TblEml->Fields->Fields[ EST ]->AsString = "P";
TblEml->Fields->Fields[ ERR ]->AsInteger = 0;
TblEml->Fields->Fields[ NTR ]->AsInteger = 0;
TblEml->Fields->Fields[ TRC ]->AsString = "";
TblEml->Fields->Fields[ TMI ]->AsDateTime = Now();

TblEml->Post();
Sleep(1000); // Este sleep lo he puesto por si había algún problema de concurrencia
result = TblEml->ApplyUpdates(-1); <---- AQUI MUERE
if (result > 0 )
{
Sleep(1000); // Para evitar clave duplicada en la tabla con el campo TMI
result = TblEml->ApplyUpdates(-1);
}
[...]

coso
03-09-2008, 15:28:28
has probado con el debugger de entrar al codigo nativo?

coso
03-09-2008, 15:30:37
solo para mirar exactamente en q punto se queda en blanco (f7,f8)

lmhjob
03-09-2008, 15:33:29
No puedo depurar ese código porque no tengo los fuentes :confused:

TOPX
03-09-2008, 16:18:26
Hola,

Puede dejar (temporalmente) el ApplyUpdates dentro de un try..except, para conocer mejor el problema en tiempo de ejecución.


try
result = TblEml->ApplyUpdates(-1);
except
on E: Exception do
ShowMessage('Este es el problema: ' +#10#13+ E.ClassName +': '+ E.Message);
end;

lmhjob
03-09-2008, 16:24:23
Sorry, no lo había incluido en el anterior trozo de código pero todo está en un try { ... } catch (Exception &e) { }

TOPX
03-09-2008, 16:40:58
Ooohh... es en C++.

Bueno, lo que se me ocurrió es que dentro del catch se muestre un mensaje pero no se levante la excepción, pues puede que algo en su sistema operativo esté cerrando la aplicación al interrumpirse.