Quizás debas insertar esta imagen en una función separada y si es necesario para mostrarlo, refrescar el registro de la tabla que lo contiene.
Este es código que tengo en uno de mis programas.
Trabaja con otro componente de base de datos, pero supongo que no tendrás problemas utilizando los tuyos.
En principio, creo un DataSet con el InsertSQL que deseo.
Luego lo ejecuto, cargando el campo BLOB mediante streams.
Código Delphi
[-]
function TDMMain.ImportarImagen(Archivo: string; EnBaseDeDatos: boolean = True): integer;
var
DS : TFIBDataSet;
m, f : TStream;
aFileName, aFileExt : string;
OPDImagen : TOpenDialog;
begin
Result := 0;
if (Archivo = '') then
begin
OPDImagen := TOpenDialog.Create(nil);
try
with OPDImagen do
begin
Filter := _('Todas las imágenes|*.bmp;*.jpg;*.gif;*.png|BitMap Images (*.bmp)|*.bmp|JPG Images (*.jpg)|*.jpg|GIF Images (*.gif)|*.gif|PNG Images (*.png)|*.png');
FilterIndex := 1;
Title := _('Carga de Imagen');
if (Execute) then
Archivo := FileName;
end;
finally
OPDImagen.Free;
end;
end;
if (Archivo > '') then
begin
aFileExt := AnsiUpperCase(ExtractFileExt(Archivo));
if aFileExt = '.JPEG' then
aFileExt := '.JPG';
aFileExt := Copy(aFileExt, 2, 3);
aFileName := ExtractFileName(Archivo);
DS := TFIBDataSet.Create(nil);
try
with DS do
begin
Transaction := TFIBTransaction.Create(nil);
try
Close;
DataBase := Self.DataBase;
with Transaction do
begin
DefaultDatabase := Self.DataBase;
TRParams.Clear;
TRParams.Add('read_committed');
TRParams.Add('rec_version');
TRParams.Add('nowait');
if (not InTransaction) then
StartTransaction;
end;
SelectSQL.Text := 'SELECT CODIGO, NOMBRE, IMAGEN, FORMATO, ORIGEN, RUTA FROM SYS_IMAGENES WHERE CODIGO = 0';
InsertSQL.Text := 'INSERT INTO SYS_IMAGENES (CODIGO, NOMBRE, IMAGEN, FORMATO, ORIGEN, RUTA) VALUES (?CODIGO, ?NOMBRE, ?IMAGEN, ?FORMATO, ?ORIGEN, ?RUTA)';
Open;
Insert;
Result := DMMain.Contador_GEN(DS, 'CONTA_IMAGENES', 'CODIGO');
FieldByName('NOMBRE').AsString := aFileName;
FieldByName('FORMATO').AsString := aFileExt;
FieldByName('RUTA').AsString := Archivo;
if EnBaseDeDatos then
begin
FieldByName('ORIGEN').AsInteger := 0;
m := DS.CreateBlobStream(FieldByName('IMAGEN'), bmWrite);
try
f := TFileStream.Create(Archivo, fmOpenRead);
try
m.CopyFrom(f, f.Size);
finally
f.Free;
end;
finally
m.Free;
end;
end
else
FieldByName('ORIGEN').AsInteger := 1;
Post;
Close;
Transaction.Commit;
finally
Transaction.Free;
end;
end;
finally
FreeAndNil(DS);
end;
end;
end;