Bonjour,
Je souhaiterais récupérer dans une variable le contenu d'un champ blob sous format hexadécimal.
Est-ce possible ? Si oui, comment ?
Merci.
JJE
Bonjour,
Je souhaiterais récupérer dans une variable le contenu d'un champ blob sous format hexadécimal.
Est-ce possible ? Si oui, comment ?
Merci.
JJE
Indiquer la BDD utilisée aurait été un plus , mais ce n'est pas une nécessité .
il faut passer par un BlobStream .
Suggestions de lecture : les FAQ Fichier dans un Blob
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Il s'agit de MySQL.
La question était mal posée sans doute. L'utilisation d'un TBlobStream ne me retourne pas la représentation hexadécimale du blob : si le champ blob contient un TRichEdit, par exemple, on reconnaitra dans le TBolbStream mon text ainsi que les caractères de contrôle inhérants au TRicheEdit. Or, ce que j'ai besoin de récupérer, c'est la représentation hexadécimale. Donc, je ne devrais voir apparaitre dans ma variable qu'une suite de caractères suivants : A..F et 0..9.
La finalité est la suivante : je dois construire dynamiquement un query INSERT que j'exécuterai avec une commande ExecSQL et je dois passer dans la partie VALUES le contenu d'un blob issu d'une autre table. Exemple de commande SQL à contruire :
En fait, dans la partie VALUES, j'ignore également comment faire comprendre à MYSQL que la valeur que je passe au champ blob est une valeur exprimée en hexadécimal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 INSERT MaTable (MaTableID, MonBloB) VALUES (23256975, #A0F9F45D709CD)
JJE
Dans la recherche, en mettant "BLOB HEXA" dans la section Delphi, tu trouves le sujet mettre image dans un 'INSERT TO', le but était de générer le SQL d'insert dans le BLOB !
Exactement la même question ! Dingue !
ce qui t'intéresse c'est l'utilisation BinToHex via un Blob et un Stream
En MySQL, je connaissais 0x mais pas # : MySQL 5.0 Reference Manual :: 8 Language Structure :: 8.1 Literal Values :: 8.1.4 Hexadecimal Literals
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 function BlobToHexaString(BlobField: TBlobField): AnsiString; var MemoryStream: TMemoryStream; begin MemoryStream := TMemoryStream.Create(); try BlobField.SaveToStream(MemoryStream); MemoryStream.Position := 0; SetLength(Result, FileStream.Size * 2); BinToHex(PAnsiChar(MemoryStream.Memory), PAnsiChar(Result), MemoryStream.Size); finally MemoryStream.Free; end; end;
?
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Merci ShaiLeTroll, c'est exactement ce qu'il me fallait !
Il s'agissait effectivement de 0x et non #.
JJE
Bonjour,
Cette discution est résolu,mais j'ai également besoin d'aide sur le sujet.
J'ai une base de données (qui n'est pas de moi) qui contient un champ appelé TVADoc en type Blob.
Je tente de lire sont contenu grace à l'astuce de Shail.
Déjà sur ta procédure Shail est-ce que cela est juste ?
SetLength(Result, FileStream.Size * 2);
car cela ne compile pas chez moi j'ai remplacé par
SetLength(Result, MemoryStream.Size * 2);
Bref lorsque je fais cela :
Cela me retourne toujours '2000', alors je comprends pas...
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls; type TForm1 = class(TForm) Cnx: TADOConnection; Button1: TButton; Qry: TADOQuery; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } function BlobToHexaString(BlobField: TBlobField): AnsiString; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // affichage champ blob With Qry do begin SQL.Clear; SQL.Add('Select TVADoc From Devis '); SQL.Add('Where Devis.Code = :xCode'); Parameters.ParamByName('xCode').Value := 'DV000002'; Open; Memo1.Text := FieldByName('TVADoc').AsString; showmessage( BlobToHexaString(TBlobField(FieldByName('TVADoc')))+#13+#10+ BlobToHexaString(FieldByName('TVADoc') as TBlobField) ); end; end; function TForm1.BlobToHexaString(BlobField: TBlobField): AnsiString; var MemoryStream: TMemoryStream; begin MemoryStream := TMemoryStream.Create(); try BlobField.SaveToStream(MemoryStream); MemoryStream.Position := 0; SetLength(Result, MemoryStream.Size * 2); BinToHex(PAnsiChar(MemoryStream.Memory), PAnsiChar(Result), MemoryStream.Size); finally MemoryStream.Free; end; end; end.
Je vous remercie de vos lumières.
La fonction a été tapé directement sur le forum pour le sujet mettre image dans un 'INSERT TO', effectivement, le code a évolué en fonction du sujet cité, a part les erreurs de syntaxe, ça doit fonctionner
TVADoc est un BLOB, il fait quel taille normalement ?
Memo1.Text contient le Blob entier ?
Vérifie les paramètres de ta Db, tu as peut-etre une limitation de la connexion sur le Blob, c'est un classique !
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager