Mensaje    Asunto: Insertar o Actualizar Imagenes son sentencias SQL, Sencillo Responder citando

Ejemplo de como INSERTAR o ACTUALIZAR una Imagen son sentencias SQL, probado con Firebird/Interbase

He buscado en todo el foro el tipo de dato TFieldType ftBlob, no habiendo encontrado nada al respecto, por lo cual creo, que este tipo de datos es desconocido en este foro. Este tipo de dato es necesario para utilizar el Método: void TParam::LoadFromFile(const AnsiString, TFieldType) del componente TIBQuery/TQuery cuando utilizamos Parámetros.

Buscar 'TFieldType Enum' en la ayuda del Builder.

Para estos ejemplos se supone que el CAMPO: Foto está declarado como:
'foto BLOB sub_type 0 segment size 80'
En este tipo de Campo podemos guardar cualquier tipo de imagen, ya que para el motor de base de datos son datos binarios largos sin tipo(LONG BINARY).

Funciona con cualquier tipo de IMAGEN.

NOTA:
Imagenes del tipo: *.JPG, *.JPEG, *.BMP, *.WMF, *.ICO y *.EMF se pueden abrir con el componente: OPenPictureDialog.

Otros tipo de Imagenes como: *.GIF, *. PNG, *. TIF ect.. se pueden poner la ruta a la Imagen "C:\\Dir_Imagenes\\Nombre_Imagen.Extension"

Si se quiere trabajar con IMAGENES JPG, hay que incluir el archivo de Cabecera:
'#include <jpeg>'

Con este Cógigo no es necesario utiliar el Objeto: TMemoryStream.

Este Código es una alternativa al enlace puesto por Cesar en Tips & Tricks: https://cppbuilder.es/viewtopic.php?t=10880

INSERCION
Código:

   IBQImagenes->Close();
   IBQImagenes->SQL->Clear();
   IBQImagenes->SQL->Add(
   "INSERT INTO Imagenes (NomImagen, Foto) VALUES ('Prueba', :Imagen);");
   IBQImagenes->ParamByName("Imagen")->LoadFromFile(OPenPictureDialog1->FileName,ftBlob);
   IBQImagenes->ExecSQL();

   if(IBTransaction->InTransaction)
      IBTransaction->CommitRetaining();

ACTUALIZACION
Código:

   IBQImagenes->Close();
   IBQImagenes->SQL->Clear();
   IBQImagenes->SQL->Add(
   "UPDATE Imagenes SET Foto = :Imagen WHERE NomImagen = 'Prueba';");
   IBQImagenes->ParamByName("Imagen")->LoadFromFile(OPenPictureDialog1->FileName,ftBlob);
   IBQImagenes->ExecSQL();

   if(IBTransaction->InTransaction)
      IBTransaction->CommitRetaining();


Cita:

Mi Opinión particular con permiso de Cesar, es que este Código es mas legible y sencillo que Utilizando un TMemoryStream.
Claro está, que hay que hacer las oportunas comprobaciones sobre el fichero de imagen antes de cargarlo en la base de datos, pero esto ya es cuestión de como cada uno quiera implementarlo.

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.