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)
-   -   Grabar un TImage en FB 2.5 (https://www.clubdelphi.com/foros/showthread.php?t=95565)

Angel.Matilla 12-02-2022 12:02:25

Grabar un TImage en FB 2.5
 
Buenos días. He estado mirando aquí y en otros foros cómo grabar el contenido de un TImage en una BB.DD. Firebird 2.5. La tabla está definida así:
Código SQL [-]
CREATE TABLE IMAGEN (
  TIPO SMALLINT NOT NULL,
  REGISTRO INTEGER NOT NULL,
  POSICION VARCHAR(1) NOT NULL,
  CARATULA BLOB SEGMENT SIZE 240);
El TImage lo cargo a partir de un fichero que selecciono con un TOpenPictureDialog y para grabar el contenido del TImage en la tabla uso esto:
Código:

TJPEGImage *ImgJpg = new TJPEGImage;
TMemoryStream *msImagen = new TMemoryStream;

msImagen->Clear();
ImgJpg->Assign(Caratula->Picture->Bitmap);
ImgJpg->SaveToStream(msImagen);
msImagen->Seek(0, soFromBeginning);

Query->Close();
Query->SQL->Text = "INSERT INTO Imagen (Tipo, Registro, Posicion, Caratula) VALUES (:Tipo, :Registro, 'P', :Caratula)";
Query->ParamByName("Caratula")->LoadFromStream(msImagen, ftBlob);
Query->ParamByName("Tipo")->AsInteger    = TabControl1->TabIndex + 1;
Query->ParamByName("Registro")->AsInteger = nRegistro;
Query->ExecSQL();
Query->Transaction->Commit();

Cunado selecciono el fichero se muestra en el formulario pero he comprobado que luego no graba nada en la tabla. ¿Algún consejo? Porque me he vuelto loco buscando ejemplos, pero ninguno me ha funcionado.

Casimiro Noteví 12-02-2022 18:23:32

¿Y algo así?
Código Delphi [-]
TBlobField(DataSet.FieldByName('caratula')).LoadFromFile(dlgAbrirFichero.FileName);

Angel.Matilla 14-02-2022 09:38:59

Sí, esa alternativa la había evaluado pero lo que me mosquea es que exactamente el mismo código en otra aplicación funciona perfectamente.

Casimiro Noteví 14-02-2022 09:53:08

Cita:

Empezado por Angel.Matilla (Mensaje 545365)
... el mismo código en otra aplicación funciona perfectamente.

Entonces habrá alguna diferencia, revísalo con lupa.

Angel.Matilla 14-02-2022 09:58:50

Eso hago. Me estoy volviendo loco. Gracias.

Angel.Matilla 14-02-2022 12:13:05

Pues no sé que habré hecho pero ahora funciona bien con este código:
Código SQL [-]
Query->Close();
Query->SQL->Text = "INSERT INTO Imagen (Tipo, Registro, Posicion, Caratula) VALUES (:Tipo, :Registro, :Posicion, :Caratula)";
Query->ParamByName("Tipo")->AsString      = TabControl1->TabIndex + 1;
Query->ParamByName("Registro")->AsInteger = nRegistro;
Query->ParamByName("Posicion")->AsString  = Imagen->Name == "Caratula" ? "P" : "T";
if (Imagen->Picture != NULL)
{
     Imagen->Picture->SaveToFile(AnsiString(getenv("TEMP")) + "\\Temp.jpg");
     Query->ParamByName("Caratula")->LoadFromStream(::ImagenToStreamJPG(AnsiString(getenv("TEMP")) + "\\Temp.jpg"), ftBlob);
}
Query->ExecSQL();
Realmente es una mezcla del que puse yo y la sugerencia de Casimiro.

Casimiro Noteví 14-02-2022 12:19:19

^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 14:03:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi