Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Compatibilidad de imagenes en campos Blob (https://www.clubdelphi.com/foros/showthread.php?t=79605)

Casimiro Notevi 03-08-2012 22:31:59

Una búsqueda en google encuentra casos hablando sobre ese tema, parece que es un problema de sqlite, como dices, que cambia el \0 por el %0

roman 03-08-2012 22:34:30

Cita:

Empezado por Casimiro Notevi
Qué extraño resulta ese asunto

Bueno, va tomando lógica ¿no? Una limitante de SQLite lo obligaba a hacer esa conversión.

Ahora, lo de

Cita:

Empezado por roman
la clase TStringStream no es compatible con la de delphi

lo dije, evidentemente, sin pensarlo bien. Estaba equivocado. Ya pude pasar el código a Lázarus para leer la imagen de SQLite y exhibirla en un Image:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  BlobField: TBlobField;
  EncodedStream: TStringStream;
  DecodedStream: TStringStream;
  DataString: String;

begin
  BlobField := SQLQuery1.FieldByName('foto') as TBlobField;
  EncodedStream := TStringStream.Create('');

  try
     // Leemos el blob
     BlobField.SaveToStream(EncodedStream);

     // Decodificamos la cadena
     DataString := DecodeString(EncodedStream.DataString);

     // Creamos un nuevo stream con la cadena decodificada
     DecodedStream := TStringStream.Create(DataString);

     try
        // Creamos el bitmap con el blob ya decodificado
        Image1.Picture.Bitmap.LoadFromStream(DecodedStream);
     finally
       DecodedStream.Free;
     end;
  finally
    EncodedStream.Free;
  end;
end;

Al menos me ha funcionado la prueba. Habrá que ver si no tiene algún problema.

// Saludos

roman 03-08-2012 22:36:14

Cita:

Empezado por Casimiro Notevi (Mensaje 438816)
que cambia el \0 por el %0

¡Ah! Cuidado. Fue mi primer intento, pero no. Reemplaza \0 por %, no por %0.

// Saludos

Casimiro Notevi 03-08-2012 23:15:07

¿Entonces el código que has puesto no es afectado por ese cambio de caracteres?

roman 03-08-2012 23:20:33

El código que puse ya usa la función DecodeString que encontré en ZEOS, para poner los % en \0s.

// Saludos

ElMug 04-08-2012 13:12:15

Gracias, Roman, voy a estudiar lo que reportas.

Se agradece mucho tu analisis.

Yo estoy usando SQLite3, a proposito, la mas reciente, en Windows 7, 32 bits.

Mas no creo que esa vaya a ser la razon.

Habra que ver.

roman 04-08-2012 15:42:52

Yo tambié usé SQLite3. Prueba el código a ver si te funciona.

// Saludos

ElMug 05-08-2012 12:14:34

Gracias, Roman por compartir tu investigacion.

Voy a instalar Zeos pero me voy a ir despacio en esto por estar ahora en otras cuestiones relacionadas, tambien con algo de sorpresa en cuanto a no ser lo que me esperaba con SQLite3 y los componentes default de Lazarus. Creo que pondre otro hilo un poco despues, ya que cheque otras cosas al respecto.

roman 06-08-2012 21:00:01

Cita:

Empezado por ElMug (Mensaje 438858)
tambien con algo de sorpresa en cuanto a no ser lo que me esperaba con SQLite3 y los componentes default de Lazarus.

En un principio culpé a Lázarus, luego a SQLite, pero ahora más bien creo que la culpa es de SQLiteAdmin.

Vamos a ver, es posible que SQLiteAdmin haya tenido la precaución de solventar la limitante de SQLite en sus versiones 2.x pero, ahora, para la versión 3.x, sigue aplicando la conversión, que no debería.

He probado otros administradores, como SQLiteManager y SQLite2009 Pro Enterprise Manager y ambos han resultado ser compatibles con el TSQLite3Connection de Lázarus sin ningún tipo de conversión, esto es, simplemente guardando los datos en el blob tal cual.

Luego entonces, más que decepcionarse de Lázarus por este aspecto, quizá habría que contemplar el uso de otro administrador en lugar del SQLiteAdmin.

// Saludos

ElMug 08-08-2012 17:43:08

Hola Roman,

Tengo ya dias investigando esto y entre otras cosas tratando de terminar mi aplicacion en Lazarus, y vine al foro de nuevo a comunicar practicamente lo mismo que concluyes, en lo que el problema este en SQLite Administrator.

Esto tambien lo verifica otro administrador llamado SQLite Man.

SQLite Man abre y muestra las imagenes que he cargado de mi aplicacion Lazarus, a una base de datos, perfectamente.

Vi que SQLite Man es un producto mas maduro y algo mas avanzado y se autorecomienda como "el mejor". Tal vez lo sea.

Voy a checar tambien los que mencionas.

En caso de alguna novedad, con gusto la reportaria.

Muchas gracias a todos ustedes por la ayuda y atencion prestada.

roman 08-08-2012 17:48:43

Cita:

Empezado por ElMug (Mensaje 439116)
Esto tambien lo verifica otro administrador llamado SQLite Man.

Cierto. Este es el que yo había visto anteriormente aunque pensé que no mostraba las imágenes.

// Saludos

roman 08-08-2012 17:55:54

Por cierto, el SQLiteMan es éste

http://sqliteman.com/

No está de más que cuando menciones algún recurso, pongas el enlace para que los demás sepamos exactamente a qué te refieres.

// Saludos

chekok 03-10-2014 12:39:55

La solución es cambiar la propiedad WriteHeader del Control TDBImage.
 
Cita:

Empezado por ElMug (Mensaje 437913)
Hay standard en cuanto a la manera de archivar imagenes en campo Blob de bases de datos, de tal manera que los diversos clientes lean esas imagenes?

Yo ya me encontre, para empezar, conque no fue asi. Pero son dos aplicaciones, una que hice en Lazarus y el otro es usando SQLiteAdministrator.

Ambase, en si mismas, estan correctas. Cada una guarda sus imagenes y las lee. Pero la otra no lee las que almacena una, y viceversa. Y no hay nada de encriptar.

Es como si guardaras texto en una y no lo pudieras leer en la otra.

Como solo se de estas dos aplicaciones, me interesa saber si hay una manera correcta o comun de archivar imagenes en campos Blob, de tal manera que la data sea compatible.

En otras palabras, que se llene el principio de que la data sea independiente de la aplicacion, en cuanto a bases de datos y sus postulados originales.

Eso te ocurre porque la propiedad WriteHeader de tu control TDBImage está con valor TRUE (valor por defecto) y de esta manera no se guarda en el blob la información de la cabecera de la imagen (si es bmp, jpg, tamaño, etc.). Para solucionarlo y ver la imagen correctamente tanto desde Lazarus como desde tu gestor de la BD, solo tienes que poner dicha propiedad a FALSE y problema resuelto. De esta manera ya guardas la imagen completa el el blob, no solo la información gráfica que solo puede ser entendida después por Lazarus. Puedes cambiar el estado de la propiedad por código o en el inspector de objetos en la pestaña propiedades.

Espero haber aclarado tu duda.

David Peñalva B 12-05-2017 20:12:14

Espero te pueda dar pistas
 
Creo que debes verificar el formato y el procedimiento como lo estas almacenando en la BD
Por ejemplo, debe ser un campo blob, pero desde el editor o administrador se esta guardando con cierto tipo de información (BMP o JPGe); y cuando tú lo estás haciendo, de seguro no le estas agregando los descriptores, correspondientes, o tipo de grafico que el administrado guarda.
En consecuencia, la forma que tu programa almacena la imagen, no conserva todos los estándares para almacenar información gráfica, sino solo dato de imagen; es por eso que tu programa lo está haciendo incompatible la información.
generalmente este tipo de error siempre sucede al almacenar en tipos blob.; recomiendo no utilizar jpge por que se degrada la imagen, entre lectura y escritura.

Casimiro Notevi 13-05-2017 00:46:58

Cita:

Empezado por David Peñalva B (Mensaje 516627)
Creo que debes verificar el formato y el procedimiento como lo estas almacenando en la BD
Por ejemplo, debe ser un campo blob, pero desde el editor o administrador se esta guardando con cierto tipo de información (BMP o JPGe); y cuando tú lo estás haciendo, de seguro no le estas agregando los descriptores, correspondientes, o tipo de grafico que el administrado guarda.
En consecuencia, la forma que tu programa almacena la imagen, no conserva todos los estándares para almacenar información gráfica, sino solo dato de imagen; es por eso que tu programa lo está haciendo incompatible la información.
generalmente este tipo de error siempre sucede al almacenar en tipos blob.;


En un blob se guarda "cualquier cosa", tal y como es.
Cita:

Empezado por David Peñalva B (Mensaje 516627)
recomiendo no utilizar jpge por que se degrada la imagen, entre lectura y escritura.


Para nada :confused:



La franja horaria es GMT +2. Ahora son las 08:49:00.

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