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)
-   -   Guardar "cualquier cosa" en un campo blob (https://www.clubdelphi.com/foros/showthread.php?t=83389)

santiago14 12-06-2013 17:22:51

Guardar "cualquier cosa" en un campo blob
 
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.

celades1 13-06-2013 07:50:59

hola


Código SQL [-]
CREATE DOMAIN T_BLOB_BINARY AS 
BLOB SUB_TYPE 0 SEGMENT SIZE 100
yo ahi meto de todo, exes etc

Saludos

Casimiro Notevi 13-06-2013 10:12:38

¿Entonces nunca leerás nada del disco, sólo de la memoria?

santiago14 13-06-2013 16:35:11

Para resolver mi problema, hice lo siguiente:

Código Delphi [-]
//.....
type
  TAviso = record
    nro_op:Integer;
    aviso:TStream;
    observaciones_aviso,
    estado_aviso:string;
  end;

//.....

uses
  DB;

//.....


procedure nuevo_aviso(r_aviso:TAviso; qAvisos:TMDOQuery);
begin
  with r_aviso, qAvisos do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Insert into avisos (nro_op, texto_aviso, ');
    SQL.add('observaciones_aviso, estado_aviso) ');
    SQL.Add('Select :nro_op, :texto, :observaciones, :estado ');
    SQL.Add('From rdb$database ');
    ParamByName('nro_op').AsInteger:=nro_op;
    ParamByName('texto').LoadFromStream(aviso, ftBlob);
    ParamByName('observaciones').AsString:=observaciones_aviso;
    ParamByName('estado').AsString:=estado_aviso;
    try
      ExecSQL;
    except
      raise;
    end;
  end;
end;

end.

Código Delphi [-]
//.....

procedure TfrmPrincipal.btnRegistroAvisoClick(Sender: TObject);
var
  stream:TStream;
  r_aviso:TAviso;
begin
  stream:=TMemoryStream.Create;
//Guardamos el contenido como un flujo en stream
  Editor.Lines.SaveToStream(stream);
  with r_aviso do
  begin
    nro_op:=StrToInt(txtNroOP.Text);
    aviso:=stream;
    observaciones_aviso:='';
    estado_aviso:='NO_PUBLICADO';
  end;
  with DataModule1 do
  begin
    terminarTransaccion;
    try
      transaccion.StartTransaction;
      nuevo_aviso(r_aviso, qAvisos);
      transaccion.Commit;
      MessageBox('Registro terminado.', PChar(lblAvisos.Caption),
        MB_OK + MB_ICONINFORMATION);
    except
      on e:Exception do
      begin
        terminarTransaccion;
        mErrores(e, 'Sin registro de aviso digitalizado.', lblAvisos.Caption);
      end;
    end;                
  end;
end;

//......

Del lado de la BD la cosa es así:
Código SQL [-]
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)
);

ALTER TABLE AVISOS ADD CONSTRAINT PK_AVISOS PRIMARY KEY (NRO_OP);

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.
Firebird 2.1, conexión: IBX, Delphi 7

Bueno, gracias nuevamente por el aporte de todos.

Santiago.

CarlosLischetti 17-08-2020 22:54:46

Tenia el mismo problema
 
Muchas gracias, tu solución me vino perfecta !


La franja horaria es GMT +2. Ahora son las 23:02:24.

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