Ver Mensaje Individual
  #8  
Antiguo 19-04-2015
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Yo antes no usaba campos blob (no puedes buscar en su interior, pesan más, etc), optaba por guardarlos fuera de la BBDD, pero eso también tiene sus inconvenientes (alguien puede borrar el archivo, debes compartir la carpeta de facturas en la red para que sean accesibles a todos los puestos, con la inseguridad que genera; las copias de seguridad tienes que incluir más archivos, etc).

Para eficiencia no hay problema con los campos Blob, porque cuando haces un select, lo único que se trae es el ID del campo Blob (es decir, no se trae el contenido del campo). Firebird guarda el contenido del campo en otra página de la Base de datos, solo se accede cuando fuerzas la lectura del contenido (por eso la mayoría de grids te ponen el texto (blob), para no realizar la búsqueda.

Por supuesto la BBDD pesará mucho más, por los campos blob, pero si tu aplicación los necesita, al final el espacio se ocupa igual (BBDD + ficheros).

A remarcar que se puede partir el archivo de BBDD llegado cierto tamaño (se especifica al crear la BBDD y ya Firebird se ocupa del resto), aunque si no usarás FAT (con su límite de 4 GB) y el disco duro es de 1 TB, pues quizás ni tengas que valorarlo.


Si los campos blob están definidos como subtipo texto, desde Firebird 2.0 puedes hacer un select buscando en su interior, algo tipo:
Código SQL [-]
select campoBlob where campoBlob containing 'pepe'
Firebird ya hace el moldeo de tipos de Blob a string automáticamente.

Si son binarios (como los pdf), tienes que andar con loadfromstream, savetoStream y Assign (no hay drama).

Cargar en un campo desde Archivo (el control de errores lía un poco el código... pero en realidad solo son 3 líneas):
Código Delphi [-]
procedure cargaFicheroEnCampo( fichero : TFilename; campo : TField );
var
  fs: TFileStream;
begin 
  if not fileExists(fichero) then raise exception.Create(Format( 'el fichero %s no Existe', fichero ));
  fs := TFileStream.Create(fichero, fmOpenRead) ; // el segundo parámetro consulta la ayuda.
  try 
    try 
        campo.loadFromStream(fs)
    except:
        ShowMessage(' Error al leer del fichero');
        raise ; 
    end;
    guardar la tabla que pertenece el campo!!  
  finally
    fs.Free; 
  end;
end;

Si el archivo es una foto y lo tienes en un TImage, en Image1.Picture tienes el SaveToStream y LoadFromStream

Y si necesitas cargarlo en memoria, para después transferirlo, usas un TMemoryStream:
Código Delphi [-]
var 
  fm : TMemoryStrem; 
begin
  fm := TMemoryStream.Create;
  image1.Picture.SaveToStream(fm);
  tabla1CampoBlob.LoadFromStream(fm);  //  campo persistente en el dataset correspondiente.
  tabla1.Post; 
  fm.free;
end;
Si un fichero es texto plano, tienes el TStringStream, todos son desdendientes de TStream y funcionan igual.

Saludos!
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 19-04-2015 a las 17:32:04.
Responder Con Cita