Login mot de passe
[SQLITE4WD] Stockage images dans un champ BLOB [forum - Accès natifs]

Parcourir ce sujet :   1 Utilisateur(s) anonymes





[SQLITE4WD] Stockage images dans un champ BLOB
Animateur
Inscrit:
2006/10/8 19:36
Messages: 249
Hors Ligne
Bonjour à tous,

Je termine bientôt mon application de gestion de catalogues mais un problème persiste.

Dans plusieurs modules, j'ai besoin de stocker l'image dans un champ BLOB.

Deux cas se présentent :

Le premier fonctionne très bien.

CAS 1 :


L'utilisateur sélectionne une image sur disque et je sauve l'image dans un BLOB (surtout pas le chemin car le catalogue est destiné à être diffusé)

Code de sélection de l'image et sauvegarde

vCheminScan est une chaîne
vCheminScan = fSélecteurImage("", "*.jpg", "Sélectionnez une image", "JPEG (*.JPG)"+TAB+"*.JPG"+RC+"BMP (*.BMP, *.RLE)"+TAB+"*.BMP, *.RLE"+RC+"GIF (*.GIF)"+TAB+"*.GIF"+RC+"TIF (*.TIF)"+TAB+"*.TIF"+RC+"PNG (*.PNG)"+TAB+"*.PNG")

FS_Image..Largeur = FS_Image..LargeurInitiale
FS_Image..Hauteur = FS_Image..HauteurInitiale

SI fFichierExiste(vCheminScan) ALORS
//sauvegarde de l'image dans la base
MonFichier est une chaîne = fChargeTexte(vCheminScan)
MonCatalogueP:mySQLTransaction(MonCatalogueP:mySQLDebut,1)
gRequeteSQL = "INSERT INTO Pictures (Pic_CatID, Pic_Titre, Pic_Picture) VALUES (%1, '" + "Pas de titre" + "'," + MonCatalogueP:mySQLEscapeString(SansEspace(MonFichier)) + ")"//on stocke l'image
gRequeteSQL=ChaîneConstruit(gRequeteSQL,eMSQ_TableID.CatID)
Retcode = MonCatalogueP :mySQLExec(gRequeteSQL, 1)

SI Retcode = Faux ALORS
Erreur("Insert image - fichier - "+ MonCatalogueP:mySQLGetErrorMessage())
FIN

MonCatalogueP :mySQLFerme(1)


Code de lecture de la base pour afficher l'image


PS : mes excuses si le champ pris pour exemple n'est pas le même que celui du code précédent.

MonCatalogueP:mySQLTransaction(MonCatalogueP:mySQLDebut,2)
gRequeteSQL = "SELECT * FROM pictures where Pic_CatID = %1"
gRequeteSQL=ChaîneConstruit(gRequeteSQL,eMSQ_TableID.CatID)
//Info(gRequeteSQL)
Retcode = MonCatalogueP :mySQLExec(gRequeteSQL, 2)

SI Retcode = Faux ALORS
Erreur("Chargement images fiche - "+ MonCatalogueP:mySQLGetErrorMessage())
FIN

//v_chaineMemo est une chaine
vnbimages est un entier

FL_Image..Visible = Faux
FL_ImageNoPicture..Visible = Faux

MonCatalogueP :mySQLPremier(2)
TableSupprimeTout(FL_TableImages)

vnbimages = 0

TANTQUE PAS MonCatalogueP:mySQLEnDehors
vnbimages=+1
FL_Image = ""
FL_Image..Visible = Vrai

MonCatalogueP:mySQLLitMemo(2,4,"FL_Image")

TableAjouteLigne(FL_TableImages, 0, MonCatalogueP:mySQLLitColParNom(2,"Pic_ID"),MonCatalogueP:mySQLLitColParNom(2,"Pic_Titre"),FL_Image)

FL_Image..Bulle = FL_TableImages[vnbimages].Titre
MonCatalogueP:mySQLSuivant(2)
FIN

MonCatalogueP :mySQLFerme(2)
MonCatalogueP:mySQLTransaction(MonCatalogueP:mySQLFin,2)



Bien j'explique maintenant le second cas qui me pose de gros soucis car je ne sais pas le coder. C'est un cas très particulier mais indispensable.

CAS 2 :

L'utilisateur sélectionne (avec un fsélecteur) une image de fond qui servira de texture.

Je souhaite copier l'image dans une cellule d'une table mémoire. Cette table contient l'ensemble du paramétrage du catalogue soit environ 70 colonnes et 130 lignes.

Lorsque je sauve l'ensemble de cette table (bouton SAUVER LE PARAMETRAGE), il faut que l'image soit bien stockée dans la base de données. Seulement pour le moment cela n'enregistre que le chemin. je n'arrive pas à stocker l'image.

Cela amène donc les questions suivantes :

- Comment copier l'image (sélectionnée par fsélecteur) vers la table ? et quel type de colonne dans la table mémoire (Texte ? Image ? J'imagine que l'on stocke en binaire mais ce type n'existe pas.

- Comment récupérer l'image de la table mémoire pour la mettre dans une variable ? et quel type de variable ?

NOTA :

Voici un aperçu de la sauvegarde de la table mémoire vers la base de données. je n'ai conservé pour l'exemple que 3 colonnes dont "FondImage" qui est le champ qui m'intéresse.

Res2 est un entier
j est un entier

CNom est une chaîne
cTypeSaisie est une chaîne
cFondImage est une chaîne

POUR j = 1 TO TableOccurrence(eMSQ_TableMasque)

CNom = eMSQ_TableMasque.Nom[j]
cTypeSaisie = eMSQ_TableMasque.TypeSaisie[j]
cFondImage = eMSQ_TableMasque.FondImage[j]//MonCatalogueP:mySQLEscapeString(SansEspace(eMSQ_TableMasque.FondImage[j]))

MonCatalogueC:mySQLTransaction(MonCatalogueC:mySQLDebut,2)
gRequeteSQL = [
SELECT * FROM Modele WHERE MSQ_Nom='%1'
]
gRequeteSQL=ChaîneConstruit(gRequeteSQL,eMSQ_TableMasque.Nom[j])
Retcode = MonCatalogueC :mySQLExec(gRequeteSQL, 1)
SI Retcode = Faux ALORS
Erreur("Sauve Masque - " + MonCatalogueC:mySQLGetErrorMessage())
FIN
MonCatalogueC:mySQLPremier(1)
TANTQUE PAS MonCatalogueC:mySQLEnDehors
Multitâche(-1)

gRequeteSQL = [
Update ModeleF set MSQ_TypeSaisie='%2', MSQ_FondImage='%3'
WHERE MSQ_Nom='%1'
]


gRequeteSQL= ChaîneConstruit(gRequeteSQL, CNom, cTypeSaisie, cFondImage)

Retcode = MonCatalogueC :mySQLExec(gRequeteSQL, 2)


SI Retcode = Faux ALORS
Erreur("Sauve Masque - "+ MonCatalogueC:mySQLGetErrorMessage())
FIN


MonCatalogueC :mySQLFerme(2)
MonCatalogueC :mySQLSuivant(1)
FIN
MonCatalogueC :mySQLFerme(1)
MonCatalogueC:mySQLTransaction(MonCatalogueC:mySQLFin,2)


FIN



Je bute complètement dans la manière de stocker provisoirement l'image dans la table mémoire et la relire pour la mettre dans la base de données.

J'espère que vous saurez m'aider. La première partie du post en tout cas en aidera certains. ^^


Zagam2

Posté le : 2013/4/2 10:14
Transférer la contribution vers d'autres applications Transférer

Sujet Auteurs Dernières réponses





[Recherche avancée]