Delphi7 personnel et Myql BLOB

Résolu
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 - 25 nov. 2010 à 14:57
 kraker31 - 31 oct. 2017 à 16:54
Bonjour,

Existe t-il un moyen de sauvegarder une image dans un champ de type BLOB dans une DB mysql, sachant que je suis sous delphi 7 personnel (pas de DBtable et TBlobStream) ?

J'utilise libmysql.dll pour dialoguer avec le SGBD

Peut-être en utilisant un Tbitmap et TStream, mais tous cela est flou pour moi. Merci pour votre aide.

11 réponses

jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
2 déc. 2010 à 15:38
J'avais fait le chargement du bitmap dans le TmemoryStream, puis de le transformer en string pour l'utilisé dans l'Insert. La solution c'est de le transformer en code Hexa.

Ce code à fonctionné.

var
  ImgExt : string;
  i : integer;
  ImgByteArray : TByteArray;
  Sql,ImgStr : String;
  my_sql: AnsiString;
  MemStream : TMemoryStream;
begin
  if OpenPictureDialog.Execute then
    begin
      ImgExt := UpperCase(ExtractFileExt(OpenPictureDialog.FileName));
      if (ImgExt = '.BMP') then
        begin
          Image1.Picture.LoadFromFile(OpenPictureDialog.FileName);
          MemStream := TMemoryStream.Create;

          Image1.Picture.Bitmap.SaveToStream(MemStream);
          MemStream.Seek(0, soFromBeginning);
          SetLength(ImgByteArray, MemStream.size);
          MemStream.ReadBuffer(ImgByteArray[0], Length(ImgByteArray));

          // Transformation en chaine Hexa
          ImgStr :='';
          for i:=0 to High(ImgByteArray) do
              ImgStr:= ImgStr + Inttohex(ImgByteArray[i],2);

          Sql := 'Insert into TableTest (Image) Values (X''' + ImgStr + ''')';
          my_sql := AnsiString(sql);

          if mysql_real_query(LibHandle, PAnsiChar(my_sql), Length(my_sql))<>0 then
            raise Exception.Create(UnicodeString(mysql_error(LibHandle)));

          MemStream.free;
        end;
  end;
end;



Bon reste à ecrire la fonction inverse pour lire le champ blob, mais je suis déja bien content
3
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
29 nov. 2010 à 11:51
Bonjour Cantador,

J'avais également trouvé ce lien mais cela explique le principe entre Php et Mysql.

Ce qui me manque c'est comment transformer le Tbitmap vers un type blob pour executer la requete :

Insert into ListImage (blob_image) VALUES (Transform_TBitMap_vers_Blob(Tbitmap));

Voila, mais sans le TBlogStream, je vois que la manipulation d'un array de bit mais c'est pas mon fort
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
29 nov. 2010 à 12:06
En l'ecrivant, je suis dit : "J'ai pas vérifié si cette fonction n'existe pas sur le site"

et voila, Cirec la fait :

Type
  TBArray = Array of Byte;

procedure Bitmap2ByteArray(const aBMP: TBitmap;var ByteArray: TBArray);
var MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    aBMP.SaveToStream(MS);
    MS.Seek(0, soFromBeginning);
    SetLength(ByteArray, MS.size);
    MS.ReadBuffer(ByteArray[0], Length(ByteArray));
  finally
    MS.free;
  end;
end;


Reste plusqu'a gérer les ajout de slashes pour les caractères non compatible avec SQL et la fonction inverse.
Je regarde, je test et ferai un retour pour les autres qui se poseront le problème.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 nov. 2010 à 10:16
Bonjour,

l'idée étant de transférer dans un flux (stream) le bitmap chargé dans un blob et de lire ensuite le stream.

J'introduirai un paramètre ce qui te permettrait d'écrire la transformation à l'extérieur de la requête SQL une fois l'image chargée dans le stream :

La syntaxe n'est pas évidente..

procedure InsertBitmap(id: Integer; MonStream: TStream);
      begin
        with Form1, Query1, Sql do
        begin
          Clear;
          Add('INSERT INTO '+ MaTable + ' (id, MonImage)');
          Add('VALUES ('+ IntToStr(id)+ ', :MonImage)');'+ ')');

          ParamByName('MonImage').LoadFromStream(MonStream, ftBlob);

          ExecSql;
        end; 
      end;


cantador
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
2 déc. 2010 à 14:34
Bonjour Cantador,

Je suis en D7 personnel, donc pas DBQuery et de type Blob.

Voici ce que j'ai fait, mais sans succés !

var
  ImgExt : string;
  ImgByteArray : TByteArray;
  Sql,ImgStr : String;
  my_sql: AnsiString;
  StrStream : TStringStream;
begin
  if OpenPictureDialog.Execute then
    begin
      ImgExt := UpperCase(ExtractFileExt(OpenPictureDialog.FileName));
      if (ImgExt = '.BMP') then
        begin
          Image1.Picture.LoadFromFile(OpenPictureDialog.FileName);
          StrStream := TStringStream.Create('');

          Image1.Picture.Bitmap.SaveToStream(StrStream);
          StrStream.Seek(0, soFromBeginning);
          SetLength(ImgByteArray, StrStream.size);
          StrStream.ReadBuffer(ImgByteArray[0], Length(ImgByteArray));


          {ImgStr :='';
          for i:=0 to High(ImgByteArray) do
              ImgStr:= ImgStr + Inttostr(ImgByteArray[i]);}

          ImgStr := StringReplace(StrStream.DataString, '''', '\''', [rfReplaceAll, rfIgnoreCase]);
          Sql := 'Insert into TableTest (Image) Values (' + ImgStr + ')';
          my_sql := AnsiString(sql);

          if mysql_real_query(LibHandle, PAnsiChar(my_sql), Length(my_sql))<>0 then
            raise Exception.Create(UnicodeString(mysql_error(LibHandle)));
          
          StrStream.free;
        end;
  end;      
end;




J'ai aussi essayé avec un TmemoryStream. Je crois que c'est le SGBD qui refuse l'insertion d'une string, avec des caractères étendus ('BMæ'#0#), dans le champ Blob.
Y'a peut-être une fonction en SQL pour cela ??
Merci de ton aide, mais je ne vois pas comment m'en sortir avec cette version de Delphi.

Jean.
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
2 déc. 2010 à 15:19
J'ai fait cet essai avec Mysql Query Browser

Insert into TableTest (Image) Values ('Ú');

Ú = Alt + 233
Dans le champ blob en Hexa, j'ai : C3 9A

Le hic est là, une string sera déformer en fonction des jeux des tables de caractère entre Delphi et Mysql.
L'idéal serai d'envoyer directement la suite des caractères hexa comme ceci :

Insert into TableTest (Image) Values (X'44656C706869');

est dans le champ blob, j'ai 'Delphi'

Voilà, a suivre ...
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
3 déc. 2010 à 10:55
Bonjour,

Je suis en D7 personnel, donc pas DBQuery et de type Blob.
pas de DBQuery ??
pas besoin, un query est toujours DB nécessairement puisque il est lié à une table..
et dans ce code
Sql := 'Insert into TableTest (Image) Values (X''' + ImgStr + ''')';
my_sql := AnsiString(sql);

ta requête n'est pas exécutée, il te manque un ExecSQL..

cantador
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
3 déc. 2010 à 12:55
Bonjour Cantador,

Si elle est executée dans la ligne suivante :

if mysql_real_query(LibHandle, PAnsiChar(my_sql), Length(my_sql))<>0 then


LibHandle est fourni lors de la connexion à la base.


Jean
0
jderf Messages postés 189 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 2 octobre 2014 1
3 déc. 2010 à 14:13
Cantador,

J'ai regardé, en faite dans les versions professionelles ou superieures, c'est un objet Tquery, et non DBquery comme j'ai ecris.
J'utilise le fichier mysql.pas qui fournit les fonctions nécessaires à l'utiliation d'un BD mysql.
0
Sauf que ça c'est du PHP donc rien a voir avec delphi 7
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 nov. 2010 à 15:28
bonjour,

Ici



cantador
-1
Rejoignez-nous