Delphi7 personnel et Myql BLOB [Résolu]

jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 25 nov. 2010 à 14:57 - Dernière réponse :  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.
Afficher la suite 

11 réponses

Répondre au sujet
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 2 déc. 2010 à 15:38
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de jderf
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 29 nov. 2010 à 11:51
0
Utile
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
Commenter la réponse de jderf
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 29 nov. 2010 à 12:06
0
Utile
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.
Commenter la réponse de jderf
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 30 nov. 2010 à 10:16
0
Utile
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
Commenter la réponse de cs_cantador
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 2 déc. 2010 à 14:34
0
Utile
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.
Commenter la réponse de jderf
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 2 déc. 2010 à 15:19
0
Utile
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 ...
Commenter la réponse de jderf
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 3 déc. 2010 à 10:55
0
Utile
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
Commenter la réponse de cs_cantador
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 3 déc. 2010 à 12:55
0
Utile
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
Commenter la réponse de jderf
jderf 192 Messages postés mercredi 29 décembre 2004Date d'inscription 2 octobre 2014 Dernière intervention - 3 déc. 2010 à 14:13
0
Utile
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.
Commenter la réponse de jderf
0
Utile
Sauf que ça c'est du PHP donc rien a voir avec delphi 7
Commenter la réponse de kraker31
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 26 nov. 2010 à 15:28
-1
Utile
bonjour,

Ici



cantador
Commenter la réponse de cs_cantador

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.