Salut,

Envoyé par
tripper.dim
J'aimerai savoir comment faire pour inserer et récupérer des fichiers dans un champ blob.
Cool, un sujet à polémique qui va finir en troll ;-) C'est pô bien de mettre des fichiers dans un champ blob. C'est très faisable, moi même je le fais et j'ai un copaing belge qui rempli des bases de 2To avec des fichiers dans des champs blob pour une base de gestion documentaire.
Avantage : Quand on déplace la base on déplace les fichiers avec, on peut gérer les droits d'accès aux blobs au même endroit que les droits d'accès au reste de la base de données et avec des blob filters (des sortes d'UDF qui agissent comme des filtres sur les blobs) on peut même, par exemple, les compresser ou/et les crypter à la volée presque de manière transparente.
Inconvénient : C'est moins rapide et moins performant (ephémisme ?) que le système d'exploitation qui est fait pour ça, ca fait grossir les bases, et si la base est cassée, on risque de perdre les fichiers.

Envoyé par
tripper.dim
Est il possible de faire une simple requete, ou faut-il faire autre chose ?
Presque, ca dépend des composants/librairies que tu utilises pour accéder à Firebird. Un exemple avec UIB :
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
|
procedure WriteToDatabase(const FileName: String);
var
T: TJvUIBTransaction;
F: TFileStream;
begin
T := TJvUIBTransaction.Create(nil);
T.Database := JvUIBDatabase1;
with TJvUIBQuery.Create(nil) do
begin
Transaction := T;
SQL.Add('insert into T_FICHIERS(NOM, CONTENU) values (?,?)');
try
F := TFileStream.Create(FileName);
try
Params.AsString[0] := FileName;
ParamsSetBlob(1,F);
Execute;
finally
F.Free;
end;
Close(etmCommit);
finally
Free;
T.Free;
end;
end; |
En fait, du point de vue de l'API de Firebird, les blobs sont envoyés à la base en utilisant d'autres fonctions que isc_execute... il faut créer un "objet" blob, l'API renvoie son ID, envoyer les données en utilisant cet ID et finalement se servir de l'ID dans une requête pour que le champ de la table fasse référence au blob par son ID, c'est ce que font les composants quand on utiliser AsBlob() (IBX ?) ou ParamsSetBlob()... (UIB)
Pour les relire, c'est pareil, techniquement le select :
select NOM, CONTENU from T_FICHIERS
ne renvoie que l'ID du blob et il faut utiliser les fonctions de l'API (ou avoir des composants qui le font pour toi) pour lire le blob séparément du reste des données renvoyées par le SELECT. (ReadBlob() dans UIB)
@+
Pierre
Partager