Ir al contenido


Foto

Guardar "cualquier cosa" en un campo blob


  • Por favor identifícate para responder
5 respuestas en este tema

#1 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 12 junio 2013 - 08:18

Buenas de nuevo, resulta que tengo que guardar en mi BD (Firebird 2.1), en un campo blob, "cualquier cosa", explico:

Es el resultado de que mi cliente va haciendo "copiar, pegar" de cosas que le interesan, de ahí que en algunos casos solo será texto, en otro caso será texto e imágenes, solo imágenes...

Para ello he dispuesto un TJvRichEdit desde donde él puede sacar y poner lo que se le antoje. El problema surge a la hora de guardar ese contenido en mi BD.
Recuerdo que este componente, si tuviéramos que guardar en disco, lo haría en formato *.rtf (formato enriquecido). Pero yo no quiero levantarlo hacia mi Base de datos desde un archivo guardado en disco si puedo hacerlo directamente desde la aplicación donde está el RichEdit con el contenido en pantalla y meterlo a mi BD. ¿Me explico?

¿Cómo lo hago? Espero haber sido claro. Gracias.

Uso Delphi 7, Firebird 2.1, IBX como conector.
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 12 junio 2013 - 09:51

Buenas,

Pues no sé si en un Blob tipo Text podrás guardar imágenes junto al texto (no lo he probado nunca), pero lo que sí podrías hacer es un Blob tipo binary y guardar en él el archivo rtf resultante de guardar a disco. Puedes hacer que toda esta conversión sea transparente para el usuario.

Nos leemos
  • 0

#3 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 13 junio 2013 - 07:28

El tronco de la solución lo he encontrado en este post. En la Respuesta N° 2 está la idea.

Por mi parte, he hecho lo siguiente:



delphi
  1. //.....
  2. type
  3.   TAviso = record
  4.     nro_op:Integer;
  5.     aviso:TStream;
  6.     observaciones_aviso,
  7.     estado_aviso:string;
  8.   end;
  9.  
  10. //.....
  11.  
  12. uses
  13.   DB;
  14.  
  15. //.....
  16.  
  17.  
  18. procedure nuevo_aviso(r_aviso:TAviso; qAvisos:TMDOQuery);
  19. begin
  20.   with r_aviso, qAvisos do
  21.   begin
  22.     Close;
  23.     SQL.Clear;
  24.     SQL.Add('Insert into avisos (nro_op, texto_aviso, ');
  25.     SQL.add('observaciones_aviso, estado_aviso) ');
  26.     SQL.Add('Select :nro_op, :texto, :observaciones, :estado ');
  27.     SQL.Add('From rdb$database ');
  28.     ParamByName('nro_op').AsInteger:=nro_op;
  29.     ParamByName('texto').LoadFromStream(aviso, ftBlob);
  30.     ParamByName('observaciones').AsString:=observaciones_aviso;
  31.     ParamByName('estado').AsString:=estado_aviso;
  32.     try
  33.       ExecSQL;
  34.     except
  35.       raise;
  36.     end;
  37.   end;
  38. end;
  39.  
  40. end.





delphi
  1. //.....
  2.  
  3. procedure TfrmPrincipal.btnRegistroAvisoClick(Sender: TObject);
  4. var
  5.   stream:TStream;
  6.   r_aviso:TAviso;
  7. begin
  8.   stream:=TMemoryStream.Create;
  9. //Guardamos el contenido como un flujo en stream
  10.   Editor.Lines.SaveToStream(stream);
  11.   with r_aviso do
  12.   begin
  13.     nro_op:=StrToInt(txtNroOP.Text);
  14.     aviso:=stream;
  15.     observaciones_aviso:='';
  16.     estado_aviso:='NO_PUBLICADO';
  17.   end;
  18.   with DataModule1 do
  19.   begin
  20.     terminarTransaccion;
  21.     try
  22.       transaccion.StartTransaction;
  23.       nuevo_aviso(r_aviso, qAvisos);
  24.       transaccion.Commit;
  25.       MessageBox('Registro terminado.', PChar(lblAvisos.Caption),
  26.         MB_OK + MB_ICONINFORMATION);
  27.     except
  28.       on e:Exception do
  29.       begin
  30.         terminarTransaccion;
  31.         mErrores(e, 'Sin registro de aviso digitalizado.', lblAvisos.Caption);
  32.       end;
  33.     end;               
  34.   end;
  35. end;
  36.  
  37. //......



Lo he probado poniendo un archivo .rtf con imágenes y texto, negrita, hipervínculos, cursiva, etc., etc. etc. y me lo pasó de 10.
No hubo necesidad de guardar el .rtf a disco, que por supuesto si el usuario desea hacerlo tiene disponible el botón "guardar" para luego levantarlo a su antojo.

Bueno, gracias nuevamente por el aporte de todos.

Santiago.
  • 0

#4 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 13 junio 2013 - 07:32

En la BD tengo lo siguiente:


CREATE TABLE AVISOS (
    NRO_OP              INTEGER NOT NULL,
    TEXTO_AVISO          BLOB SUB_TYPE 0 SEGMENT SIZE 100,
    OBSERVACIONES_AVISO  VARCHAR(1000),
    ESTADO_AVISO        VARCHAR(50)
);



Firebird 2.1, conexión: IBX, Delphi 7

Saludos.
  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 13 junio 2013 - 07:34


Bueno, gracias nuevamente por el aporte de todos.

Santiago.


Gracias por compartirnos la solución final amigo.

un abrazo
  • 0

#6 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 13 junio 2013 - 07:39

Por nada.

Santiago.
  • 0




IP.Board spam blocked by CleanTalk.