Ver Mensaje Individual
  #1  
Antiguo 23-09-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Reputación: 20
anubis Va por buen camino
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.
Responder Con Cita