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.

Guardar "cualquier cosa" en un campo blob
Started by
santiago14
, Jun 12 2013 08:18 AM
5 replies to this topic
#1
Posted 12 June 2013 - 08:18 AM
#2
Posted 12 June 2013 - 09:51 AM
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
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
#3
Posted 13 June 2013 - 07:28 AM
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:
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.
Por mi parte, he hecho lo siguiente:
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.
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; //......
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.
#4
Posted 13 June 2013 - 07:32 AM
En la BD tengo lo siguiente:
Firebird 2.1, conexión: IBX, Delphi 7
Saludos.
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.
#5
Posted 13 June 2013 - 07:34 AM
Bueno, gracias nuevamente por el aporte de todos.
Santiago.
Gracias por compartirnos la solución final amigo.
un abrazo
#6
Posted 13 June 2013 - 07:39 AM
Por nada.
Santiago.
Santiago.