Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   minitutorial como leer y escribir campos blob cualquiera (https://www.clubdelphi.com/foros/showthread.php?t=80380)

anubis 23-09-2012 03:44:18

minitutorial como leer y escribir campos blob cualquiera
 
Despues de haber batallado y por fin resuelto gracias a vosotros, os pongo un minitutorial del cómo de hace.
No se si es la mejor manera pero funciona.

Uso lazarus y sqlite3 y esta realizado en windows 7.

Para guardar un archivo cualquiera en campo blob de la base de datos:

Código Delphi [-]
PROCEDURE TFORM1.ANADIRBLOB;
 VAR
   BLOB:TSTREAM;
STREAM:TSTREAM;
 BEGIN
 if not OpenDialog1.Execute then Exit;

    BLOB:=TFILESTREAM.Create(OPENDIALOG1.FileName,FMOPENREAD); //Asignamos el archivo abierto al stream blob.
    ZQUERY1.INSERT; // Insertamos un nuevo registro.
   STREAM:=zquery1.CreateBlobStream(zquery1.FieldByName('factura'), bmWrite); //Preparamos el campo blob para escritura.
   STREAM.CopyFrom(BLOB,BLOB.Size); //Copiamos el archivo que hemos abierto al Stream para que el query lo guarde.
   ZQUERY1.FieldByName('TIPO').ASSTRING:=RIGHTSTR(OPENDIALOG1.FileName,3); //guardo la extensión del archivo.
   BLOB.DESTROY; 
   STREAM.DESTROY;
   ZQUERY1.Post; //guardo el registro.
 end;

Para leer un archivo blob desde un registro de la base de datos.

Código Delphi [-]
PROCEDURE TFORM1.LEERBLOB;
 VAR
   BLOB:TSTREAM;
   TIPO:STRING;
   BEGIN
   TIPO:='ARCHIVO.'+ZQUERY1.FIELDBYNAME('TIPO').ASSTRING; // Se extrae la extensión del archivo guardado y se le añade a un nombre temporal (archivo).
     blob := zquery1.CreateBlobStream(zquery1.FieldByName('factura'), bmRead); //asignamos al stream el blob
   try
    blob.Seek(0, soFromBeginning); //nos posicionamos al principio del stream (sino lo pongo no funciona bien).
    with TFileStream.Create(TIPO, fmCreate) do //preparamos el archivo para guardar posteriormente.
      try
        CopyFrom(blob, blob.Size) //copiamos del stream quedando guardado como archivo.extension.
      finally
        Free
      end;
  finally
    blob.Free
   end;
  ShellExecute(0, 'open', PChar(TIPO), Nil,Nil, SW_SHOWNORMAL); // abrimos externamente con el programa predeterminado.
  END;

La verdad no se si es la mejor opcion para hacer estas cosas, pero funciona.
Lo publico porque he visto que bastantes foreros tienen problemas con estos campos.

Un saludo y gracias a todos.

Casimiro Notevi 23-09-2012 10:37:45

Cita:

Empezado por anubis (Mensaje 444023)
La verdad no se si es la mejor opcion para hacer estas cosas, pero funciona.
Lo publico porque he visto que bastantes foreros tienen problemas con estos campos.
Un saludo y gracias a todos.

Gracias a ti, por compartirlo :)


La franja horaria es GMT +2. Ahora son las 01:04:11.

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