Voilà un bout de code que j'ais écris récemment.
Il necessite une table avec une colonne pour stocker l'extension du fichier. En faisant ainsi, on peut utiliser un peu plus de formats d'image que ceux supportés par DBImage. Si ça peut vous aider ....
Il faut lui ajouter l'unité pngimage (
[ Lien ] ) pour supporter les png.
On peut aussi utiliser graphicex mais il est buggé pour les png. Du coup je l'ai viré.
unit uImagesEtBD;
interface
uses ADODB, SysUtils, Graphics, classes, DB, jpeg, pngimage;
procedure ChargerImage(Conn: TADOConnection;
NomTable, NomColID, NomColImage, NomColExtension: string;
ValeurID: Integer;
Image: TPicture);
procedure EnregistrerImage(Conn: TADOConnection;
Fichier: TFileName;
NomTable, NomColID, NomColImage, NomColExtension: string;
ValeurID: Integer);overload;
procedure EnregistrerImage(Conn: TADOConnection;
Image: TPicture; Extension: String;
NomTable, NomColID, NomColImage, NomColExtension: string;
ValeurID: Integer);overload;
implementation
procedure EnregistrerImage(Conn: TADOConnection;
Image: TPicture; Extension: String;
NomTable, NomColID, NomColImage, NomColExtension: string;
ValeurID: Integer);overload;
const
REQ = 'UPDATE %s set %s = :P1, %s = :P2 WHERE %s = %d';
var
St: TMemoryStream;
begin
St := TMemoryStream.Create;
try
if Assigned(Image) then Image.Graphic.SaveToStream(St);
St.Position := 0;
with TADOQuery.Create(nil) do
begin
Connection := Conn;
Close;
SQL.Text := format(REQ, [NomTable, NomColImage, NomColExtension, NomColID, ValeurID]);
ParamCheck := True;
Parameters.ParamByName('P1').LoadFromStream(St, ftBlob);
Parameters.ParamByName('P2').Value := Extension;
try
ExecSQL;
except
on E: Exception do
Raise Exception.CreateFmt('Erreur lors de l''insertion de l''image dans la base de données : %s',
[E.Message]);
end;
end;
Finally
St.Free;
end;
end;
procedure EnregistrerImage(Conn: TADOConnection;
Fichier: TFileName;
NomTable, NomColID, NomColImage, NomColExtension: string;
ValeurID: Integer);
const
REQ = 'UPDATE %s set %s = :P1, %s = :P2 WHERE %s = %d';
var
St: TMemoryStream;
Image: TPicture;
begin
Image := TPicture.Create;
St := TMemoryStream.Create;
try
Image.LoadFromFile(Fichier);
EnregistrerImage(Conn, Image, ExtractFileExt(Fichier), Nomtable, NomColID, NomColImage, NomColExtension, ValeurID);
Finally
Image.Free;
St.Free;
end;
end;
procedure ChargerImage(Conn: TADOConnection;
NomTable, NomColID, NomColImage, NomColExtension: string;
ValeurID: Integer;
Image: TPicture);
var
St: TMemoryStream;
begin
St := TMemoryStream.Create;
try
with TADOTable.Create(nil) do
begin
Connection := Conn;
TableName := NomTable;
Open;
if FieldByName(NomColImage).IsNull then
Image := nil
else
begin
(FieldByName(NomColImage) as TBlobField).SaveToStream(St);
St.Position := 0;
St.SaveToFile('toto' + FieldByname(NomColExtension).AsString);
Image.LoadFromFile('toto' + FieldByname(NomColExtension).AsString);
DeleteFile('toto' + FieldByname(NomColExtension).AsString);
end;
Close;
Free;
end;
Finally
St.Free;
end;
end;
end.