Bien sûr! Ci-dessous vous trouverez le code qui a fait le travail. Nous construisons un petit exemple SQL, mais je ne suis pas non plus un expert SQL, alors faites attention
Ce code est capable de transférer des JPG d'une taille maximale de 256 Ko. Si vous souhaitez transférer des images plus grandes, augmentez simplement le nombre de colonnes, c'est-à-dire ajoutez ImgVarChar8, ImgVarChar9 etc.
Peut-être pourrez-vous m'aider avec ma question complémentaire ici ?
Acclamations!
-------------- Démarrage du code SQL --------------
CRÉER UNE TABLE tIMG(
Clé primaire d'identité ID INT,
Img VARBINAIRE(MAX)
)
ALLER
INSÉRER DANS tIMG(Img) SELECT BulkColumn FROM
OPENROWSET (BULK 'C:\Test\test.jpg', SINGLE_BLOB) AS InsertIMG
ALLER
CRÉER UNE VUE vImg AS
SELECT convertir(varchar(max),sous-chaîne(Img,0,32000),2) ImgVarChar0
,convertir(varchar(max),sous-chaîne(Img,32000,32000),2) ImgVarChar1
,convertir(varchar(max),sous-chaîne(Img,64000,32000),2) ImgVarChar2
,convertir(varchar(max),sous-chaîne(Img,96000,32000),2) ImgVarChar3
,convertir(varchar(max),sous-chaîne(Img,128000,32000),2) ImgVarChar4
,convertir(varchar(max),sous-chaîne(Img,160000,32000),2) ImgVarChar5
,convertir(varchar(max),sous-chaîne(Img,192000,32000),2) ImgVarChar6
,convertir(varchar(max),sous-chaîne(Img,224000,32000),2) ImgVarChar7
DE [dbo].[tIMG]
ALLER
-------------- Fin du code SQL --------------
-------------- Démarrage du code JMP --------------
// Requête SQL pour obtenir les données hexadécimales (chaînes) de la base de données.
// Les chaînes sont stockées dans différentes colonnes de la table de données "JPG_Query".
Nouvelle requête SQL (
Connexion(
"Votre connexion"
),
NomRequête( "JPG_Query" ),
Sélectionnez( Colonne( "ImgVarChar0", "t1" ), Colonne( "ImgVarChar1", "t1" ) ,
Colonne( "ImgVarChar2", "t1" ) ,Colonne( "ImgVarChar3", "t1" ),
Colonne( "ImgVarChar4", "t1" ) ,Colonne( "ImgVarChar5", "t1" ),
Colonne( "ImgVarChar6", "t1" ) ,Colonne( "ImgVarChar7", "t1" ) ),
De( Table( "vImg", Schéma( "dbo" ), Alias( "t1" ) ) ),
) << Exécuter ;
// Boucle pour construire l'image JPG à partir des chaînes hexadécimales et afficher l'image (il y a peut-être du code redondant...)
commutateur = 0 ;
count_try = 0;
max_try = 200 ;
code hexadécimal = "" ;
Tandis que(switch == 0 & count_try < max_try,
count_try++;
Essayer(
hexcode1 = DataTable("JPG_Query"):Name("ImgVarChar0")[1];
hexcode2 = DataTable("JPG_Query"):Name("ImgVarChar1")[1];
hexcode3 = DataTable("JPG_Query"):Name("ImgVarChar2")[1];
hexcode4 = DataTable("JPG_Query"):Name("ImgVarChar3")[1];
hexcode5 = DataTable("JPG_Query"):Name("ImgVarChar4")[1];
hexcode6 = DataTable("JPG_Query"):Name("ImgVarChar5")[1];
hexcode7 = DataTable("JPG_Query"):Name("ImgVarChar6")[1];
hexcode8 = DataTable("JPG_Query"):Name("ImgVarChar7")[1];
hexcode = hexcode1||hexcode2||hexcode3||hexcode4||hexcode5||hexcode6||hexcode7||hexcode8;
image = Ouvrir (Hex vers Blob (code hexadécimal), "jpg");
Si ( Is Missing(hexcode) == 0 & Is Scriptable( Data Table("JPG_Query") ) == 1 ,
Nouvelle fenêtre( "Image JPG", image );
code hexadécimal = "" ;
commutateur = 1 ;
Fermer(Table de données("JPG_Query") , NoSave);
);
,
Attendez (0,01);
Si (count_try == max_try ,
Throw("Erreur!");
);
); // Fermer Essayer
); // Ferme pendant
-------------- Fin du code JMP --------------
Aucune raison d'être désolé. Je suis étonné de la rapidité avec laquelle les réponses sont données ici
Et encore, merci beaucoup ! Jusqu'à présent, nous avons pu faire ce qui suit :
1. Dans la base de données, nous avons converti l'image de BLOB (varbinary(max)) en hexadécimal à l'aide de la fonction CONVERT et en définissant le style sur "2" - cela laisse de côté le "0x" au début de la chaîne.
2. Nous avons transféré la chaîne hexadécimale vers jmp via une requête où elle est enregistrée dans une table de données.
3. Nous avons montré l'image avec la fonction que vous avez mentionnée : New Window("Foo", Open(HexToBlob(hex-string)), "jpg")
Mais maintenant, nous sommes confrontés au problème du 64k. Depuis que nous avons compris que cela signifie essentiellement que nous ne pouvons stocker que 64 Ko dans une seule cellule d'une table de données, nous avons eu l'idée de diviser la chaîne hexadécimale de la base de données sur plusieurs colonnes et de la concaténer dans jmp après avoir importé le parties en plusieurs colonnes.
J'en ferai rapport bientôt.
Passe un bon week-end!
EDIT : ça marche ! Nous avons pu transférer le JPG en divisant d'abord l'image binaire en parties, en convertissant les parties de la base de données en hexadécimal, en transférant les parties hexadécimales et enfin en les concaténant à nouveau dans jmp. Vraiment super! Merci.
Désolé d'avoir pris si longtemps.J'ai fait quelques recherches à ce sujet (merci Bryan), je pense que cela va être limité par un tampon de 64 Ko dans JMP 12 qui l'empêchera de fonctionner avec des images de plus de 32 Ko (après avoir doublé leur taille en hexadécimal, ils ont rencontré le problème de 64 Ko) .Ce n'est pas beaucoup, même en JPG.Bryan (connaît bien plus SQL que moi) dit "Si j'ai créé une colonne "Encodée" de VARCHAR (max) et que j'y ai codé le varbinary en utilisant CONVERT, alors j'obtiens les données de chaîne HEX comme prévu. "Voici une référence https://basitaalishan.com/2014/09/11/sql-server-converting-binary-data-to-a-hexadecimal-string/ J'ai trouvé; laissez le 0x (style) au recto de l'hex que vous envoyez à JMP.
Une fois que vous avez converti ces données hexadécimales et que vous les avez insérées dans une table de données JMP, vous devriez pouvoir récupérer l'image comme ceci :
//hex = hex(loadtextfile("$desktop/hi.jpg",blob)); // voici comment j'ai obtenu des données hexadécimales
//écrire(hexadécimal);
hexadécimal="";
image = ouvert( hextoblob(hex), "jpg");
newwindow( "décodé", image );
un jpg 4K.
Salut Craig,
merci pour votre réponse. Oui, il s’agit bien de données codées en hexadécimal. Nous lisons en fait un JPG avec un logiciel .NET dans une base de données, où il est enregistré dans une colonne de type varbinary (max). Donc, comme vous le dites, je suppose qu'il est possible de transférer les données codées en hexadécimal vers jmp via une requête SQL. À ce sujet, nous nous posons deux questions :
1. Comment lire une colonne varbinary(max) dans une colonne de caractères dans jmp via une requête ?
2. Que faut-il faire pour transformer les données de la colonne de caractères en image ?
Je sais que ces questions peuvent aller trop loin, mais tout petit indice est apprécié.
Merci!
EDIT : je suis tombé sur ce fil , qui répond à ce que nous voulons faire. En référence à cela, je suppose qu'il est nécessaire de transférer d'abord les données BLOB en hexadécimal dans la base de données, puis de les transférer vers JMP.
Je pense que JMP le fait pas prend en charge le transfert de données binaires depuis SQL.Mais, si vous pouvez transférer les données binaires vers JMP, peut-être sous forme de données codées en hexadécimal dans une colonne de caractères dans une table de données, elles peuvent alors être reconverties en image.Vous aurez besoin de savoir quel est le format des données, JPG, PNG, RAW.S'il s'agit de RAW, vous devrez savoir quel est le format brut et comment l'utiliser.
Lorsque j'ai lu la question pour la première fois, j'imaginais que le tableau d'octets contenait des données RAW RVB, mais il semble plus probable qu'il s'agisse d'un PNG ou d'un JPG, ce qui serait un problème plus simple que de décoder les données RAW.