Bonjour à tous,

Je viens vers vous car les informations que je trouve sur le net à ce sujet sont floues voir fausses...

Je suis débutant en Delphi et en MySQL et je dois stocker des images dans ma BDD.
On m'a conseillé d'utiliser le format de données appelé "Blob".
J'ai donc créé la BDD et jusque là, pas de souci.

Seulement, je dois développer un gestionnaire de BDD en Delphi et j'ai donc besoin de gérer les Blobs.
Pour cela, j'ai utilisé une méthode trouvé sur le net à base de "Stream" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
33
function TGestBDD_FDS.AjoutImage(pNom, pAdresse: string): boolean;
var
  lStream: TStream;
  lJpg: TJpegImage;
begin
  Result := False;
  try
    Result := ExecuteRequete(['INSERT INTO ' + TABLE_IMAGE,
                             ' (' + FIELD_IMAGE_NOM + ')' +
                             ' VALUES (' + QuotedStr(pNom) + ')']);
  finally
        FCnx.Close;
  end;
 
  lJpg := TJpegImage.Create;
  lJpg.LoadFromFile(pAdresse);
  try
    if ExecuteRequete(['SELECT * FROM ' + TABLE_IMAGE,
                       'WHERE (' + FIELD_IMAGE_NOM + ' = ' + QuotedStr(pNom) + ')']) then
    begin
      FQry.Edit;
      lStream := FQry.CreateBlobStream(FQry.FieldByName(FIELD_IMAGE_IMAGE), bmWrite);
      try
        lJpg.SaveToStream(lStream);
        FQry.ExecSQL;
      finally
        lStream.Free;
      end;
    end;
  finally
    lJpg.Free;
  end;
end;
Avec la fonction "ExecuteRequete" ci dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
33
34
35
36
37
38
39
function TGestBDD.ExecuteRequete(pLignes: array of string): Boolean;
var
   i : Shortint;
begin
     ConnectMySQL;
 
     // fermeture de la requête
     FQry.Close;
 
     // initialisation du SQL
     FQry.SQL.Clear;
 
     // remplissage de la requête
     for i := 0 to (Length(pLignes) - 1) do FQry.SQL.Add(pLignes[i]);
 
     try
        // si la requête est un select ou show
        if (Pos('SELECT', FQry.SQL[0]) > 0) or
           (Pos('SHOW'  , FQry.SQL[0]) > 0) then
        begin
             // ouverture de la requête
             FQry.Open;
             // on se place sur le premier enregistrement
             FQry.First;
        end
        // sinon exécution de la requête
        else FQry.ExecSQL;
 
        Result := True;
     except
           on E: Exception do
           begin
                MessageBox(Application.Handle, PChar(E.Message + #13 + #13 + FQry.SQL.Text),
                           PChar('Erreur SQL'), MB_ICONERROR);
                FQry.SQL.SaveToFile('SQL.txt');
                Result := False;
           end;
     end;
end;
Seulement, j'ai l'impression que mon Blob ne s'est pas sauvegardé car j'ai toujours la valeur "Null" associé à mon champ LongBlob.
Mes connaissances en Delphi étant limitées, il m'est compliqué de débuger seul ce problème..

Merci beaucoup pour vos futures réponses et désolé pour cette question de débutant.
Bien cordialement,
William Durand.