Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema longitud stringlist.text (https://www.clubdelphi.com/foros/showthread.php?t=41221)

Bicho 09-03-2007 19:27:56

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.

poliburro 09-03-2007 19:46:06

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;

Bicho 12-03-2007 13:12:52

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


La franja horaria es GMT +2. Ahora son las 05:12:10.

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