Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   InterBase, c++ Builder y campos Blob (https://www.clubdelphi.com/foros/showthread.php?t=41458)

Albertuni 15-03-2007 22:20:09

InterBase, c++ Builder y campos Blob
 
Estoy haciendo una aplicación en Borland C++Builder, y manejo una Base de datos de InterBase. En ella necesito guardar videos. (Para que no surga la discusión, son pequeños y ya está evaluada la opción de guardarlos fuera y guardar sólo una referencia al fichero.) Bueno, los videos los guardo en campos Blob. Ahí va mi problema: al guardarlos parece que se guardan bien, porque la base de datos incrementa lo mismo que ocupa el fichero, (para ello utilizo el método loadFromFile(), y luego a la hora de sacarlos, utilizando SaveToFile(), me crea el nuevo fichero pero vacío (0Kb).
No tengo ni idea de porque es.

Si alguien sabe algo del tema, porfavor me ayude.

Saludos

TJose 16-03-2007 04:28:10

Hola

Que componentes estas usando?
Yo trabajé con los ibx y dbx.

Saludos
TJose

Albertuni 17-03-2007 19:01:39

Hola Jose, gracias por responder.
Yo utilizo los componentes ibx.
En concreto ahora creo que el problema es al guardarlo en la base de datos. He probado a ver el tamaño del campo blob en el que supuestamente está el video, y me dice que su tamaño es 0. Eso explicaría que lo leo bien, y por eso me crea el fichero vacío. Espero que me puedas contar como insertarlo a ver si van por ahí los tiros.

Muchas gracias por todo

TJose 18-03-2007 01:37:43

Hola

dstDocumentacion es un TIBDataSet con un select que incluye el campo Documento

El ejemplo muestra como guardar y recuperar el documento (exportar - importar). Recuerdo haberlo probado con archivo muy grandes y funcionaba.

La definición del campo documento está dada por:

Código SQL [-]
CREATE DOMAIN DARCHIVOBINARIO AS
BLOB SUB_TYPE 0 SEGMENT SIZE 100;

Código:

void __fastcall TfrmPrincipal::aclImportarExecute(TObject *Sender)
{
  dlgAbrir->Filter = "Documentos de Word (*.doc)|*.DOC|Archivos RTF (*.rtf)|*.RTF|Archivos de texto (*.txt)|*.TXT|Todos los archivos (*.*)|*.*";
  if(dlgAbrir->Execute()){
      AnsiString Archivo;
      Archivo = dlgAbrir->FileName;
      TBlobField *Documento = (TBlobField *) datDocumentacion->dstDocumentacion->FieldByName("Documento");
      Documento->Clear();
      Documento->LoadFromFile(Archivo);
      edtArchivo->Text = ExtractFileName(Archivo);
  } 
}
//---------------------------------------------------------------------------

void __fastcall TfrmPrincipal::aclExportarExecute(TObject *Sender)
{
  dlgGuardar->Filter = "Documentos de Word (*.doc)|*.DOC|Archivos RTF (*.rtf)|*.RTF|Archivos de texto (*.txt)|*.TXT|Todos los archivos (*.*)|*.*";
  dlgGuardar->FileName = edtArchivo->Text;
  if(dlgGuardar->Execute()){
      AnsiString Archivo;
      Archivo = dlgGuardar->FileName;
      TBlobField *Documento = (TBlobField *) datDocumentacion->dstDocumentacion->FieldByName("Documento");
      Documento->SaveToFile(Archivo);
  }
}
//---------------------------------------------------------------------------

Saludos
TJose

Albertuni 18-03-2007 15:02:15

Voy a probarlo a ver si consigo hacerlo funcionar y te cuento.
Muchísimas gracias.
Alberto

Albertuni 26-03-2007 22:17:57

Problema resuelto
 
:) :) :) :) :) :) :) :) :) :)
Hola Jose,
la verdad es que al principio no conseguía hacerlo funcionar. Pero me diste algunas pistas para solucionarlo. contigo y con la ayuda de un programa que desde aquí hago publicidad, ya que me ha parecido algo cojonudo.
Si utilizais InterBase, olvidaros de IBConsole y utilizad IBExpert, os ayudará mucho más.
Bueno, el problema era que se me guardaba en la bbdd pero no se guardaba la referencia a él dentro del campo blob, pero todavía no se porque, así que la obtengo después de hacer loadfromfile, y se la guardo en el campo.

Ahora bien, me surge otro problemilla, creo que similar. A la hora de borrar, me ocurre que se me borra aparentemente bien, pero el tamaño de la bbdd no decrementa. Imagino que unicamente borro la referencia, y no lo que ocupa verdaderamente el fichero.
A ver si alguien sabe como puedo hacerlo.

Muchas gracias

Saludos, Alberto

TJose 27-03-2007 00:51:56

Hola

Cita:

Ahora bien, me surge otro problemilla, creo que similar. A la hora de borrar, me ocurre que se me borra aparentemente bien, pero el tamaño de la bbdd no decrementa. Imagino que unicamente borro la referencia, y no lo que ocupa verdaderamente el fichero.
A ver si alguien sabe como puedo hacerlo.
Esto no es un problema. Es normal este funcionamiento. Si deseas recuperar el espacio producido por la eliminacion de registros con backup/restore se consigue. Salvo que el espacio en disco fuera un problema, yo ni me preocuparía por recuperar el espacio.

Saludos
TJose

Albertuni 27-03-2007 13:34:32

muchas gracias, es un gran alivio.
la base de datos podría crecer mucho, pero no creo que se borren muchos, asi que podría pasar de ello, y si no pues probaré el backup/restore.

gracce per tutto:)


La franja horaria es GMT +2. Ahora son las 05:22:48.

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