Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-04-2015
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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 18:32:04.
Responder Con Cita
  #2  
Antiguo 21-04-2015
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 24
RONPABLO Va por buen camino
Yo aun no entiendo que es lo que pretende hacer con:
Cita:
Lo que yo quisiera es insertar un nuevo registro para añadir una nueva factura (campo blob) a un cheque evitando traerme todos las facturas de ese cheque.
osea, no entiendo que pretende hacer, de pronto podría explicar un poco más a ver si captamos la idea.


Por otro lado como te dijo Lepe al hacer la consulta que trae el campo blob en realidad estas treyendo algo así como una máscara con un texto que dice blob, el proceso de cargar el pdf no se ejecuta en una sentencia similar a:

Código SQL [-]
select numcheque, factura from cheques where numcheque = 1

así que no tendrás problemas de velocidad por hacer dicho query.

Pero ya que vas a guardar archivos pdf en la bd podría ser mejor que lo tengas en una base dados diferente por motivos prácticos, por ejemplo si dejas los archivos blob en la misma base datos donde guardas el resto de información está crecerá mucho, trayendo como gran inconveniente una demora cada vez mayor a la hora de hacer copias de seguridad, yo llegue a tener una base de datos con imágenes que pesaba 30G (documentos escaneados de varios años de un archivo, y obviamnete no estaba formateado el equipo en fat32 si no en NTFS), hacer una copia de seguridad de un archivo que pesa 300M es demorado, imagina 1G, 2G o 30G, es caótico si alguien lo hace manualmente, puedes programar una rutina para generar periódicamente una copia de seguridad pero ocurre que ahora tendrás otro gran problema los pdf (o lo que tengas en el archivo blob) tal vez no sea lo que más se guarde en la base de datos (pero si lo que más ocupa en espacio) así que por seguridad podrías querer tener copia diaria del resto de la información, pero de los pdf se puede tomar el riesgo de no tener una copia en digamos unos 8 días, al tenerlo en la misma bd no podrás definir si hacer esto o no, siempre tendrás que hacer copia de todo con el consiguiente gasto de espacio en disco duro, en pocas semanas ya tendrás lleno cualquier disco duro.

En fin espero sirva de algo estos comentarios.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DB firebird meter y sacar texto e imagenes a campos blob , con delphi JXJ Firebird e Interbase 1 11-10-2010 12:52:34
Error al insertar un nuevo registro FGarcia Firebird e Interbase 3 19-07-2008 23:01:25
Como Insertar Registro Nuevo ENTRE los demás Registros???? AGAG4 Conexión con bases de datos 1 18-01-2006 04:03:45
Insertar Nuevo Registro perillan Conexión con bases de datos 3 24-04-2005 15:30:23
Error al insertar nuevo registro Humberto Firebird e Interbase 13 06-05-2004 23:45:01


La franja horaria es GMT +2. Ahora son las 19:15:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi