[QR] Comment insérer et récupérer un fichier dans un champ de type BLOB ?
Cette QR prendra exemple avec les composants ADO mais elle est fonctionnel avec n'importe quel composant de base de données.
Dans les exemples qui vont suivres, on considèrera que nous travaillons sur la structure de table suivante :
Id : Champ auto incrémenté
Nom : Champ texte/varchar de 100 en taille
Fichier : Champ Blob
A- L'insertion
Il y a 2 méthodes pour insérer des documents (Images ,Documents Texte, programmes, etc ...) dans une base de données :
1- Par chargementa- Avec une requete
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
if OpenDialog.execute then
With AdoQuery do
begin
Close;
SQL.Clear;
SQL.add('insert into MaTable(Nom,Fichier)');
SQL.Add('Values(:PNom,:PFichier)');
ParamCheck := True;
Parameters.ParamByName('PNom').Value := ExtractFileName(OpenDialog.Filename);
Parameters.ParamByName('PFichier').LoadFromFile(OpenDialog.Filename, ftBlob);
try
ExecSQL;
Except on E:Exception do
begin
Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' +
E.Message);
end;
end;
end; |
b- Avec une table
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
if OpenDialog.execute then
With AdoTable do
begin
// Met la table en mode insertion de données
Append;
// enregistrement du nom de fichier dans la base de données
FieldByName('Nom').asString := ExtractFileName(OpenDialog.Filename);
// Enregistrement du fichier dans la base de données
(FieldByName('Fichier') as TBlobField).LoadFromFile(OpenDialog.Filename, ftBlob);
try
// On ajoute dans la base de données
Post;
Except on E:Exception do
begin
// On annule la tentative d'ajout dans la base de données
Cancel;
Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' +
E.Message);
end;
end;
end; |
2- Par assignation
Cette méthode nécessite que l'on connaisse à l'avance le type de données que l'on va transmettre à la base de données.
Dans les deux exemples qui vont suivre, nous utiliseront des images.
a- Avec une Requete
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
var
Img : TBitmap;
begin
if OpenDialog.execute then
try
img := TBitmap.Create;
img.LoadFromFile(OpenDialog.FileName);
With AdoQuery do
begin
Close;
SQL.Clear;
SQL.Add('insert into MaTable(Nom,Fichier)');
SQL.Add('Values(:PNom,:PFichier)');
ParamCheck := True;
Parameters.ParamByName('PNom').Value := ExtractFileName(OpenDialog.Filename);
Parameters.ParamByName('PFichier').Assign(Img);
try
ExecSQL;
Except on E:Exception do
begin
Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' +
E.Message);
end;
end;
end;
finally
img.free;
end;
end; |
b- Avec une Table
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
var
Img : TBitmap;
begin
if OpenDialog.execute then
try
img := TBitmap.Create;
img.LoadFromFile(OpenDialog.FileName);
With AdoTable do
begin
// Met la table en mode insertion de données
Append;
// enregistrement du nom de fichier dans la base de données
FieldByName('Nom').asString := ExtractFileName(OpenDialog.Filename);
// Enregistrement du fichier dans la base de données
FieldByName('Fichier').Assign(Img);
try
// On ajoute dans la base de données
Post;
Except on E:Exception do
begin
// On annule la tentative d'ajout dans la base de données
Cancel;
Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' +
E.Message);
end;
end;
end;
finally
img.free;
end;
end; |
B- La récupération
1 2 3 4 5 6 7 8 9 10 11 12
|
var
sPath : String
begin
With AdoTable do
begin
// Récupération du nom du fichier
sPath := ExtractFilePath(Application.ExeName) + FieldByName('Nom').AsString;
// sauvegarde du fichier
TBlobField(FieldByName('Fichier')).SaveToFile(sPath);
end;
end; |
Partager