Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-03-2007
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Problema longitud stringlist.text

Hola amigos,

tengo un problema que me ronda ya 2 días y hace unos minutos encontré cual era la raíz del problema.
Os pongo en situación:

- Tengo una aplicación que realiza un proceso
- Al terminar el proceso, debe mandar un correo a los usuarios con los resultados del proceso
- Ese correo se guarda en una base de datos para que después un motor (servicio de windows que desarrolló hace una semana) lea esa tabla y envie el correo.
Hasta aquí bien.
- La tabla contiene los campos para mandar un correo: de, para, cc, cco, asunto y body entre otros.
- Body es un CLOB en oracle. Ahí no hay problema, comprobado.
- El valor del body se inserta en la tabla mediante un SP a través de una función genérica (para todos los SP que tengamos) que tambien va bien.
- Pero ese body ahora mismo se manda a través de un StringList.
- El programa genera el body en un memo y lo copia en el StringList para mandarlo al SP y que se guarda en la BD. Se manda al SP del siguiente modo:
Mensaje.Text //mensaje es el StringList.

Si el body es pequeño (500 carácteres o 50 lineas cifras aproximadas) no hay ningún problema.
Pero tengo un caso particular en que el proceso dio muchos resultado y resulta que el stringlist contine unas 1700 lineas. Que no debería haber problemas para el CLOB (deben caber unos 2Gb).

Cuando ese caso se da, y tengo más de 50 lineas, si debuggeo veo en mensaje.count = 50 o las que sean (1700 en el caso en concreto), y cuando asigno el mensaje.text al SP para mandar todo el contenido al CLOB me corta.
Es decir, hago un debug y visualizo el valor de mensaje.text y no tiene más de 50 lineas. Podeis hacer la prueba a ver si ocurre lo mismo.
He probado ha pasar todo el StringList a un TStringStream, pero a la hora de asignarlo al SP no se si hay otra manera que no sea usando DataString, ya que ocurre lo mismo.

Que posible solución veis a mi problema.
Uso Delphi 6 (por si es un bug de la versión)

Saludos y gracias anticipadas.
Responder Con Cita
  #2  
Antiguo 09-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
dudo que sea el TStringList y te voy a decir por que:

Yo almaceno en una instancia de este objeto el XML que me genera un proceso, Este Xml me ha llegado a ocupar hasta 15,000 líneas y cuando lo paso al Sp no me corta la información.

Yo uso Delphi 7 y SqlServer

El código que uso es el siguiente:


Código Delphi [-]
 
//Método que crea los parámetros
 
Function TdmCrgImagenes.CreaParametros(Var PAdpProcAlm: TADOStoredProc; PsNomSp: String): String;
Begin
  Result := 'Nada';
  Try
    PAdpProcAlm.Close;
    With PAdpProcAlm.Parameters Do
      Begin
        Clear;
        If PsNomSp = 'TiendaVirtual.Dbo.TDV001SpSUIDGenRevImgTiendaVirtual' Then
          Begin
            CreateParameter('@PVMenu',ftString,pdInput,25,'');
            CreateParameter('@PTXmlImg',ftMemo,pdInput,0,'');
            CreateParameter('@PVUsuario',ftString,pdInput,15,'');
            CreateParameter('@PMensaje',ftString,pdOutput,250,'');
          End;
      End;
  Except
    On Error: Exception Do
      Result := 'Ocurrió un error al crear los parámetros necesarios para la ' +
        'ejecución del procedimiento almacenado. Error: ' + Error.Message + '. Por favor ' +
        'notifique al admonistrador';
  End;
End;
 
//Envia el xml con información de las imágenes existentes en el directorio de captura
Function TdmCrgImagenes.CargaXmlImagenes(PStlXmlImg: TStringList): String;
Begin
  Result := 'Nada';
  Try
    AdpImgCarga.Close;
    AdpImgCarga.ProcedureName := 'TiendaVirtual.Dbo.TDV001SpSUIDGenRevImgTiendaVirtual';
    Result := CreaParametros(AdpImgCarga,AdpImgCarga.ProcedureName);
    If Result = 'Nada' Then
      With AdpImgCarga.Parameters Do
        Begin
          ParamByName('@PVMenu').Value := 'CargaTmpImagenes';
          ParamByName('@PTXmlImg').Value := PStlXmlImg.Text;
          AdpImgCarga.ExecProc;
          Result := ParamByName('@PMensaje').Value;
        end;
  Except
    On Error: Exception do
      Result := 'Ocurrió un error al realizar la carga de imágenes a la tabla temporal. ' +
        'Error: ' + Error.Message + '. Por favor notifique al administrador';
  End;
End;
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 12-03-2007
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Muchas gracias poliburro por responder.

He hecho una prueba, con un fichero de más de 20.000 lineas lo he cargado en un StringList y luego lo recorro para meterlo en un Memo y no he tenido ningún problema.
Ahora deduzco que el problema pueda ser entonces del Variant.
Y me explico, la función genérica que usamos para ejecutar los SP los parámetros que se le pasan a la susodicha es un array de variants donde separados por comas se pasan los parámetros del SP.
Entonces es problable que pueda venir por ahí el problema, y es que el variant tenga un límite y corte el blob que yo le estoy pasando.
Si es así, no me quedará otra que modificar la función genérica y hacerla exclusivamente para mi SP pasándole por separado el campo Blob como parámetros, algo así:

Código Delphi [-]
function ExecProcedure(Nombre_Proc : string; datos : array of Variant; campoBlob : TBlobStream) : variant;

¿Hay alguna sugerencia al respecto o algún tipo de dato que pueda usar en la función en lugar del TBlobStream?
Cualquier sugerencia será bienvenida.

Saludos y gracias
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 longitud de campo Data4 Tablas planas 0 04-03-2007 00:51:43
Longitud Maxima Para Un Input->text CARLOS E HTML, Javascript y otros 1 10-06-2006 00:10:05
TEdit Propiedad Text problema para cambiar alucardo OOP 12 29-05-2006 16:12:08
Guardar lo que tengo en un Edit1.text y edit2.text en una base de datos firebird jorgeluisc Conexión con bases de datos 1 23-04-2006 18:29:28
Limite del StringList victork_py Varios 8 11-05-2004 22:19:11


La franja horaria es GMT +2. Ahora son las 17:19:22.


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