PDA

Ver la Versión Completa : Problema longitud stringlist.text


Bicho
09-03-2007, 19:27:56
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:




//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í:

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