BC42104 La variable 'img' est utilisée avant qu'une valeur ne lui soit affectée

Signaler
-
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020
-
Bonjour,
J'espère que vous aller bien,
Si vous me permettez j'ai un problème avec l'avertissement "BC42104 La variable 'img' est utilisée avant qu'une valeur ne lui soit affectée" dans mon code, chose qui m'empêche d'implémenter des données dans mon application sur visual studio 2019.
Je demande votre aide.
Merci d'avance.

Ci-joint mon code :
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        If editMode Then

            Dim img() As Byte

            Try
                Dim mstream As New System.IO.MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()
            Catch ex As Exception

            End Try

            Try
                Cmd = New NpgsqlCommand("Update bv SET nom=@nom , superficie = @area , carte = @carte  WHERE id =" + CStr(id) + " ;", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = CStr(TextBox1.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = CDec(TextBox2.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.Binary)).Value = img

19 réponses

Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Bonjour
Initialise la variable avec
Nothing

Par contre 2
Try Catch 
dans la même procédure ? Ce n'est guère recommandé

Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjours,
Merci beaucoup pour votre réponse, j'ai essayer d'initialiser la variable avec "Nothing" mais l'erreur reste le même.
En effet je veux déclarer "img" comme variable.
Je vous demande si vous avez autre solution.
Cordialement.
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Sur quelle ligne se produit l'erreur ?
autre chose : la déclaration de variable serait mieux placée dans le Try Catch avec 1 seul Try Catch
 If editMode Then
           Try
                Dim img() As Byte = nothing
                Dim mstream As New System.IO.MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()
                Cmd = New NpgsqlCommand("Update bv SET nom=@nom , superficie = @area , carte = @carte  WHERE id =" + CStr(id) + " ;", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = CStr(TextBox1.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = CDec(TextBox2.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.Binary)).Value = img
'  suite du code 
           Catch ex As Exception

            End Try
End If

Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

L'erreur se produit au niveau de la ligne 11, value = img
Quand j'essaye d'implémenter une image , elle ne s'affiche pas , le message affiché est que "Buffer ne peut pas être null"
Merci d'avance
Messages postés
14883
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
28 mai 2020
409
Bonjour

Quand on met try catch et qu’il y a une erreur, il faut la traiter

Là tu ne traites pas, donc si tu as une erreur dans ton premier bloc (et il y en a probablement une) la variable img n’est pas affectée, comme tu ne traites pas l’erreur, quand tu arrives dans le second bloc, img ne vaut rien.
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Bonjour
Ce bout de code fonctionne sans problème chez moi et img contient bien un tableau de bytes une fois ce code exécuté .
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim img As Byte()
        Dim mstream As New System.IO.MemoryStream
        PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
        img = mstream.GetBuffer()
        mstream.Close()

    End Sub

End Class


J'en conclus donc que le souci vient de NpgsqlParameter qui n'accepterait donc pas le DbType.Binary .
D'ailleurs on voit que DbType.String et DbType.Decimal sont sur en bleu : ce qui signifie qu'ils sont bien reconnus alors que DbType.Binary ne l'est pas !
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Bonsoir
Je ne connais pas Npgsql mais en fouillant sur le Net j'ai vu que le type Binary existe avec NpgsqlTypes .
Remplace tous les
DbType
par
NpgsqlTypes

On ne sait jamais !

Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Dommage que cela ne fonctionne pas
Reprenons le code : c'est exactement le code d'origine mais je l'ai optimisé .
Par contre j'ai mis une apostrophe devant l'importation de NpgsqlTypes à la seconde ligne .
Peux-tu me dire si les 6 lignes avec DbType produisent ou non une erreur ?
Si oui enlève l'apostrophe ( cette manipulation nous prouvera que c'est bien
DbType.Binary
qui pose problème
En fouillant sur le Net j'ai vu que les tableaux de bytes sont du type DbType.Bytea . Je l'ai mis à la place de DbType.Binary dans le code
Si cela ne fonctionne pas il va falloir trouver un autre moyen de stocker les bytes de l'image

Autre chose : dans ton code on voit des MsgBox, Cstr, etc.... Ce sont des mots clés de Visual Basic 6 qui sont gardés par VB Net pour compatibilité . C'est à éviter : si on fait du VB Net autant faire du vrai VB Net
Pour ceci on va dans le menu Projet - Propriétés de "NomduProjet"
On arrive sur cet interface


On ouvre alors References et on arrive là-dessus


Reste à décocher Microsoft Visual Basic
J'ai fait les quelques corrections pour avoir du vrai VB Net

Imports Npgsql
'Imports NpgsqlTypes
Imports System.IO
Imports System.Text.RegularExpressions

Public Class Addsbv
    Public id As Integer
    Public id_sbv As Integer
    Public surface As Decimal
    Public nom As String
    Public imgSelected() As Byte
    Public editMode As Boolean

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_eng.Click
       
         Try                
                Dim img() As Byte  
                Dim mstream As New MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()
                If editMode Then
                        Cmd = New NpgsqlCommand("Update sbv SET nom=@nom , surface = @area , carte = @carte  WHERE id =" + id_sbv.ToString + " ;", Conn)
                        Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = tb_nom.Text
                        Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = ConVert.ToDecimal(tb_surface.Text)
                        Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.Bytea)).Value = img
                        Conn.Open()
                        Cmd.ExecuteNonQuery()
                        MessageBox.Show("SBV modifier !")
                Else
                       Cmd = New NpgsqlCommand("INSERT INTO sbv(nom,surface,carte , id_bv) values (@nom , @area , @carte , " & id.ToString & ")", Conn)
                       Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = tb_nom.Text
                       Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = Convert.ToDecimal(tb_surface.Text)
                       Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.Bytea)).Value = img
                       Conn.Open()
                       Cmd.ExecuteNonQuery()
                       MessageBox.Show("SBV Ajouté !")
              End If
       Catch ex As Exception
             MessageBox.Show(ex.Message, "Erreur",MessageBoxButtons.OK, MessageBoxIcon.Warning)
             Exit Sub
        Finally
             Conn.Close()
             Me.Close()
        End Try

    End Sub

    Private Sub PictureBox1_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick
        OpenFileDialog1.FileName = Nothing
        OpenFileDialog1.ShowDialog()
        PictureBox1.ImageLocation = OpenFileDialog1.FileName
    End Sub

    Private Sub Addsbv_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If editMode Then
            btn_eng.Text = "Modifier"
            tb_nom.Text = nom
            tb_surface.Text = surface
            Try
                Dim ms As New MemoryStream(imgSelected)
                PictureBox1.Image = Image.FromStream(ms)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Erreur",MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End Try
        End If
    End Sub
End Class 



Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Bonjour !
Cela tombe mal car les bases de données ce n'est pas mon domaine de prédilection et de plus je ne connais point PostgreSql du tout . Toutes les informations que je vous ai données je les ai trouvées sur le Net en fouillant .
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjour,
je vous remercie infiniment pour votre aide et pour le temps que vous m'avez consacré
Messages postés
14883
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
28 mai 2020
409
Bonjour

je n'ai pas pu revenir sur ce sujet hier en raison du réseau aléatoire là où j'étais.
Et VB95 faisais ça très bien (salut copain).
Je n'ai pas plus de compétence que lui en bases de données.

Cependant, je peux répondre à cette question, qui je crois est restée en suspend

S'il vous plait comment je peux traiter l'erreur ?

Déjà 2 blocs try/catch à la suite n'est pas une bonne idée, il vaut mieux regrouper, comme tu l'as fait.
La première chose à faire est de mettre un messageBox comme tu l'as fait, aussi.
Si l'erreur est systématique, il faut en trouver la raison et la corriger.
Si c'est une erreur récurrente, si on peut l'éviter c'est mieux, par exemple si tu dois ouvrir un fichier sur un réseau, il faut mieux vérifier avant que le fichier existe que de traiter une exception "fichier introuvable".
Si on ne peut pas l'éviter, il peut être utile de faire un bloc catch spécifique à ce type d'erreur. Par exemple, ce fichier y'a un programme qui l'écrit quand il veut et toi tu veux le lire toute les heures. Il est possible que tu essayes de lire pendant l'écriture et ton accès est bloqué. Si tu fais un bloc catch pour cette erreur, tu peux lancer un timer de 5 secondes qui fera retenter la lecture.

Je voulais aussi rebondir sur cet excellent conseil de VB95
Mieux vaut le copier qu'une fois dans un sous-programme et l'appeler lorsque l'on en a besoin .

Plus qu'un conseil cela devrait être une "loi" pour tout codeur.
Si tu dois écrire 2 fois le même code, c'est que tu as mal codé.
En effet, s'il y a une correction ou une évolution, il faudra l'implémentée autant de fois que tu as dupliqué le code.

Rien que là (regarde les commentaires à partir de Else)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_eng.Click
        If editMode Then
            Dim img() As Byte = Nothing
            Try
                Dim mstream As New System.IO.MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()

                Cmd = New NpgsqlCommand("Update sbv SET nom=@nom , surface = @area , carte = @carte  WHERE id =" + CStr(id_sbv) + " ;", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", NpgsqlTypes.String)).Value = CStr(tb_nom.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@area", NpgsqlTypes.Decimal)).Value = CDec(tb_surface.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", NpgsqlTypes.Binary)).Value = img

                Conn.Open()
                Cmd.ExecuteNonQuery()
                MsgBox("SBV modifier !")
                Conn.Close()
                Me.Close()

            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Erreur")
                Exit Sub
            Finally
                Conn.Close()
            End Try
        Else
            Dim img() As Byte = Nothing  'ligne dupliquée
            Try  'ligne dupliquée
                Dim mstream As New System.IO.MemoryStream  'ligne dupliquée
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)  'ligne dupliquée
                img = mstream.GetBuffer()  'ligne dupliquée
                mstream.Close()  'ligne dupliquée

                Cmd = New NpgsqlCommand("INSERT INTO sbv(nom,surface,carte , id_bv) values (@nom , @area , @carte , " & CStr(id) & ")", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", NpgsqlTypes.String)).Value = CStr(tb_nom.Text)  'ligne dupliquée
                Cmd.Parameters.Add(New NpgsqlParameter("@area", NpgsqlTypes.Decimal)).Value = CDec(tb_surface.Text)  'ligne dupliquée
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", NpgsqlTypes.Binary)).Value = img  'ligne dupliquée
                Conn.Open()  'ligne dupliquée
                Cmd.ExecuteNonQuery()
                MsgBox("SBV Ajouté !")
                Conn.Close()  'ligne dupliquée
                Me.Close()  'ligne dupliquée

            Catch ex As Exception  'ligne dupliquée
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Erreur")  'ligne dupliquée
                Exit Sub  'ligne dupliquée
            Finally  'ligne dupliquée
                Conn.Close()  'ligne dupliquée
            End Try  'ligne dupliquée

        End If
    End Sub


Sur 20 lignes, 2 ne sont pas dupiquées, et encore elle sont très proches.

VB95 a déjà condensé dans son message 15
https://codes-sources.commentcamarche.net/forum/affich-10101483-bc42104-la-variable-img-est-utilisee-avant-qu-une-valeur-ne-lui-soit-affectee#15 , mais on peut réduire encore plus

        Try
            Dim StringImage As String
            Dim img As Byte()
            Dim mstream As New MemoryStream
            PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
            img = mstream.GetBuffer() ' les bytes de l'image
            For i = 0 To img.Length - 1
                StringImage = StringImage & img(i).ToString("X2") ' on convertit chaque byte en 2 caractères hexadécimaux
            Next
            
            Dim leMessage As String = "SBV modifier !"
            mstream.Close()
            If editMode Then
                Cmd = New NpgsqlCommand("Update sbv SET nom=@nom , surface = @area , carte = @carte  WHERE id =" + id_sbv.ToString + " ;", Conn)
            Else
                Cmd = New NpgsqlCommand("INSERT INTO sbv(nom,surface,carte , id_bv) values (@nom , @area , @carte , " & id.ToString & ")", Conn)
                leMessage As String = "SBV Ajouté !"
            End If

            Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = tb_nom.Text
            Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = Convert.ToDecimal(tb_surface.Text)
            Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.String)).Value = Stringimage
            Conn.Open()
            Cmd.ExecuteNonQuery()
            MessageBox.Show(leMessage)

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        Finally
            Conn.Close()
            Me.Close()
        End Try

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjour,
S'il vous plait comment je peux traiter l'erreur ?
Merci d'avance.
Voici la totalité du script :
Imports Npgsql
Imports NpgsqlTypes
Imports System.IO
Imports System.Text.RegularExpressions

Public Class Addsbv
    Public id As Integer
    Public id_sbv As Integer
    Public surface As Decimal
    Public nom As String
    Public imgSelected() As Byte
    Public editMode As Boolean

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_eng.Click
        If editMode Then
            Dim img() As Byte = Nothing
            Try
                Dim mstream As New System.IO.MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()

                Cmd = New NpgsqlCommand("Update sbv SET nom=@nom , surface = @area , carte = @carte  WHERE id =" + CStr(id_sbv) + " ;", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = CStr(tb_nom.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = CDec(tb_surface.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.Binary)).Value = img

                Conn.Open()
                Cmd.ExecuteNonQuery()
                MsgBox("SBV modifier !")
                Conn.Close()
                Me.Close()

            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Erreur")
                Exit Sub
            Finally
                Conn.Close()
            End Try
        Else
            Dim img() As Byte = Nothing

            Try
                Dim mstream As New System.IO.MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()

                Cmd = New NpgsqlCommand("INSERT INTO sbv(nom,surface,carte , id_bv) values (@nom , @area , @carte , " & CStr(id) & ")", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = CStr(tb_nom.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = CDec(tb_surface.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.Binary)).Value = img
                Conn.Open()
                Cmd.ExecuteNonQuery()
                MsgBox("SBV Ajouté !")
                Conn.Close()
                Me.Close()

            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Erreur")
                Exit Sub
            Finally
                Conn.Close()
            End Try

        End If
    End Sub

    Private Sub PictureBox1_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick
        OpenFileDialog1.FileName = Nothing
        OpenFileDialog1.ShowDialog()
        PictureBox1.ImageLocation = OpenFileDialog1.FileName
    End Sub

    Private Sub Addsbv_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If editMode Then
            btn_eng.Text = "Modifier"
            tb_nom.Text = nom
            tb_surface.Text = surface
            Try
                Dim ms As New MemoryStream(imgSelected)
                PictureBox1.Image = Image.FromStream(ms)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End Sub
End Class


Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjour,
Je vous remercie infiniment pour votre aide précieuse,
Si vous me permettez comment je peux régler ce problème avec NpgsqlParameter.
Merci d'avance.
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonsoir,
J'ai remplacé les "DbTypes" par "NpgsqlTypes", mais malheureusement aucune résultat.
Une autre erreur se réclame c'est que le type de variable n'est pas un membre de "NpgsqlTypes".

Voici le script :

Imports Npgsql
Imports NpgsqlTypes
Imports System.IO
Imports System.Text.RegularExpressions

Public Class Addsbv
    Public id As Integer
    Public id_sbv As Integer
    Public surface As Decimal
    Public nom As String
    Public imgSelected() As Byte
    Public editMode As Boolean

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_eng.Click
        If editMode Then
            Dim img() As Byte = Nothing
            Try
                Dim mstream As New System.IO.MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()

                Cmd = New NpgsqlCommand("Update sbv SET nom=@nom , surface = @area , carte = @carte  WHERE id =" + CStr(id_sbv) + " ;", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", NpgsqlTypes.String)).Value = CStr(tb_nom.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@area", NpgsqlTypes.Decimal)).Value = CDec(tb_surface.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", NpgsqlTypes.Binary)).Value = img

                Conn.Open()
                Cmd.ExecuteNonQuery()
                MsgBox("SBV modifier !")
                Conn.Close()
                Me.Close()

            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Erreur")
                Exit Sub
            Finally
                Conn.Close()
            End Try
        Else
            Dim img() As Byte = Nothing
            Try
                Dim mstream As New System.IO.MemoryStream
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
                img = mstream.GetBuffer()
                mstream.Close()

                Cmd = New NpgsqlCommand("INSERT INTO sbv(nom,surface,carte , id_bv) values (@nom , @area , @carte , " & CStr(id) & ")", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", NpgsqlTypes.String)).Value = CStr(tb_nom.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@area", NpgsqlTypes.Decimal)).Value = CDec(tb_surface.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", NpgsqlTypes.Binary)).Value = img
                Conn.Open()
                Cmd.ExecuteNonQuery()
                MsgBox("SBV Ajouté !")
                Conn.Close()
                Me.Close()

            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Erreur")
                Exit Sub
            Finally
                Conn.Close()
            End Try

        End If
    End Sub

    Private Sub PictureBox1_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick
        OpenFileDialog1.FileName = Nothing
        OpenFileDialog1.ShowDialog()
        PictureBox1.ImageLocation = OpenFileDialog1.FileName
    End Sub

    Private Sub Addsbv_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If editMode Then
            btn_eng.Text = "Modifier"
            tb_nom.Text = nom
            tb_surface.Text = surface
            Try
                Dim ms As New MemoryStream(imgSelected)
                PictureBox1.Image = Image.FromStream(ms)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End Sub
End Class 


Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonsoir,
Je tien à vous remercie pleinement pour les efforts que vous fournissez
J'ai décoché Microsoft Visual Basic du référence.
Les seules lignes qui produisent un erreur sont ceux qui contiennent "DbType.Bytea", donc le même problème qui se produit.
S'il vous plait comment alors on peut trouver un autre moyen de stocker les bytes de l'image ?
Je vous remercie très sincèrement.


Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Bonsoir
Au moins je ne me suis pas trompé dans les modifications vers un code en Vrai .NET ( prononcez Do Net )
Maintenant au niveau du stockage des bytes de l'image : c'est très rare que l'on stocke dans une base de données les bytes d'une image . On stocke plutôt le chemin d'un fichier avec son nom complet qui contient le fichier image . On crée dans l'application un répertoire qui va contenir tous les fichiers image utilisés et la base de données stocke le chemin d'accès à ce même fichier

Comment stocker les bytes si on veut garder ce système : sous forme de chaine de caractères où un byte est représenté par sa valeur écrite sous forme hexadécimale
Exemple

soit les bytes 10, 128, 255, 16 et 0
cela se traduit par la chaine "0A80FF1000" : chaque byte occupe 2 caractères
10 = 0A
128 = 80
255 = FF
16 = 10
0 = 00

Dans ce cas il faut faire la conversion Bytes vers Chaine pour le stockage dans la base et la conversion Chaine vers Bytes pour lire le contenu de l'image et l'afficher .
Mais cela risque d'alourdir la base de données surtout si la talle des images est importante .
Je cherche toujours une solution néanmoins
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonsoir,
J'ai des petites images à implémenter de format png, ce sont des cartes des bassins versants et de leurs sous bassins.
Est ce que je peux recopier le code que vous m'avez donné pour tous les séquences là où je doit implémenter des images ?
J'apprécie beaucoup le temps que vous m'avez consacré, je vous remercie très sincèrement.
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Il n'y a aucun souci pour recopier le code que je vous ai fourni .
Il est même là pour cela
Par contre vous dites "Pour toutes les séquences" . Mieux vaut le copier qu'une fois dans un sous-programme et l'appeler lorsque l'on en a besoin .

Par contre on peut tenter la conversion Bytes vers String pour les images
ATTENTION : mettre le champ carte de la base de données avec le type String si vous utilisez ce code
Pour lire une image dans la base il faudra peut-être faire la conversion inverse . Si nécessaire prévenez moi

Imports Npgsql
Imports NpgsqlTypes
Imports System.IO
Imports System.Text.RegularExpressions

Public Class Addsbv

    Public id As Integer
    Public id_sbv As Integer
    Public surface As Decimal
    Public nom As String
    Public imgSelected() As Byte
    Public editMode As Boolean

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_eng.Click

        Try
            Dim StringImage As String
            Dim img As Byte()
            Dim mstream As New MemoryStream
            PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
            img = mstream.GetBuffer() ' les bytes de l'image
            For i = 0 To img.Length - 1
                StringImage = StringImage & img(i).ToString("X2") ' on convertit chaque byte en 2 caractères hexadécimaux
            Next
            mstream.Close()
            If editMode Then
                Cmd = New NpgsqlCommand("Update sbv SET nom=@nom , surface = @area , carte = @carte  WHERE id =" + id_sbv.ToString + " ;", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = tb_nom.Text
                Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = Convert.ToDecimal(tb_surface.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.String)).Value = Stringimage
                Conn.Open()
                Cmd.ExecuteNonQuery()
                MessageBox.Show("SBV modifier !")
            Else
                Cmd = New NpgsqlCommand("INSERT INTO sbv(nom,surface,carte , id_bv) values (@nom , @area , @carte , " & id.ToString & ")", Conn)
                Cmd.Parameters.Add(New NpgsqlParameter("@nom", DbType.String)).Value = tb_nom.Text
                Cmd.Parameters.Add(New NpgsqlParameter("@area", DbType.Decimal)).Value = Convert.ToDecimal(tb_surface.Text)
                Cmd.Parameters.Add(New NpgsqlParameter("@carte", DbType.String)).Value = StringImage
                Conn.Open()
                Cmd.ExecuteNonQuery()
                MessageBox.Show("SBV Ajouté !")
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        Finally
            Conn.Close()
            Me.Close()
        End Try

    End Sub

    Private Sub PictureBox1_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick

        OpenFileDialog1.FileName = Nothing
        OpenFileDialog1.ShowDialog()
        PictureBox1.ImageLocation = OpenFileDialog1.FileName

    End Sub

    Private Sub Addsbv_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        If editMode Then
            btn_eng.Text = "Modifier"
            tb_nom.Text = nom
            tb_surface.Text = surface
            Try
                Dim ms As New MemoryStream(imgSelected)
                PictureBox1.Image = Image.FromStream(ms)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End Try
        End If

    End Sub

End Class
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

S'il vous plait, je m'excuse pour ce dérangement mais j'ai pas saisie comment je dois faire la conversion inverse pour lire l'image dans la base.
En effet, j'ai essayé le code mais lorsque j'ajoute la carte, elle ne s'affiche pas.
L'avertissement suivant s'affiche :

Merci d'avance.
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Bonsoir
1) Est-ce que le champ carte s'enregistre bien sur la base de données ? avec le type String évidemment

2) J'ai oublié d'initialiser StringImage
Try
            Dim StringImage As String = String.Empty


3) Dans quelle partie du code affiches-tu la carte lorsque tu l'ajoutes ?
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109 >
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020

Pour la conversion inverse
ajouter Imports System.Collections.Generic

' StringImage est la chaine carte d'une image dans la base de données
Dim StringImage As String = "001074A0FF"   ' pour tester
Dim ListBytes As List(Of Byte) = New List(Of Byte)
Dim Index As Integer = 0
For i = 0 To (StringImage.Length \ 2) - 1
       ListBytes.Add(Convert.ToByte(StringImage.Substring(Index, 2), 16))
       Index += 2
Next
Dim img() As Byte = ListBytes.ToArray

Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020
>
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020

Donc je peux garder dans la base le type bytea
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109 >
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Non c'est un String qui est stockée dans la base de données pour le champ carte
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonsoir,
Pour la première question j'utilise PostgreSql et je ne trouve pas le type string dans les choix de déclaration est ce que je peux utiliser le type char ?
Puis je pense que la partie du code pour afficher la carte me manque.
Pouvez vous m'aidez s'il vous plait.
Merci d'avance.
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
1) Utilisez le même type dans la base que pour le champ nom : c'est le type Text d'après la documentation
2) Le code pour afficher la carte depuis la base de données c'est celui que je vous ai donné .
- on récupère le champ carte d'une image dans la base de données
- on fait la conversion avec le code donné
- on remplit un MemoryStream avec les bytes de l'image
- on affiche l'image dans la PictureBox
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020
>
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020

Bonjour,
Enfin j'ai pu récupérer ma table, avec les colonnes de type string.
J'ai essayer votre code mais les cartes ne s'affiche encore pas mais je savais pas comment ajouter Imports System.Collections.Generic ;
où je dois placer le code de conversion que vous m'avez donner dans le code initial.
Merci infiniment.
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjour,
Hier j'ai eu un grand problème que j'ai pas pu le discuter avec vous, j'ai supprimé la table carte de la base de données par accident, puis j'ai créé une nouvelle table avec les critères que vous m'avez décrit mais il m'affiche que la relation carte n'existe plus. Puisque j'utilise PostgreSql 12.
Maintenant je suis perturbé et je ne sais pas qu'est que je dois faire.
Il me reste un petit espoir en vous si vous pouvez m'aider s'il vous plait.
Je vous remercie très sincèrement.

Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjour,
je vous remercie infiniment pour votre aide.
Cordialement.
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjour
Merci beaucoup pour votre aide, mais mon problème reste le même : mes cartes ne s'affichent pas lorsqu'elles sont ajoutées.
Merci d'avance.
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Bonjour ( un salut à Whismeril en passant )
C'est exact : je n'avais pas fait la réduction des 3 lignes qui ajoutent les 3 champs dans la base .
Par quel code ajoutez-vous ces cartes ?
Autre chose :
Lorsque vous enregistrez une nouvelle carte à partir de la PictureBox tout se passe-t-il correctement au niveau de l'enregistrement dans la base de données ? si besoin pour le vérifier utiliser le débogage pas à pas .
De plus trop commenter du code est un défaut mais pas le commenter du tout l'est encore plus . Cela vous permet à vous de vous y retrouver plus facilement et à nous de comprendre plus facilement ce que fait le code .
Exemple ici avec le conversion bytes -> string des octets d'une PictureBox
 PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
 img = mstream.GetBuffer() ' les bytes de l'image
 For i = 0 To img.Length - 1
        StringImage = StringImage & img(i).ToString("X2") ' on convertit chaque byte en 2 caractères hexadécimaux
 Next
 mstream.Close()
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020
>
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020

Bonsoir,
Le code d'ajout des cartes est le suivant :
Public Class DisplayCarte
    Public img() As Byte

    Private Sub DisplayCarte_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            Dim ms As New MemoryStream(img)
            PictureBox1.Image = Image.FromStream(ms)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub
End Class


Le message "carte ajouté" s'affiche au niveau de l'interface de l'application mais la carte ne s'affiche pas et je trouve pas l'enregistrement dans la base de données.
Merci d'avance.
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109 >
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonjour
tu as écrit : Le message "carte ajouté" s'affiche au niveau de l'interface de l'application mais la carte ne s'affiche pas et je trouve pas l'enregistrement dans la base de données.
Merci d'avance.

C'est lorsque tu enregistres une nouvelle carte je suppose et elle ne s'enregistre pas dans la base .
Normalement la carte est affichée dans la Picturebox1 avant son enregistrement ?
Est-ce que la table des cartes (avec son nom, son aera et sa carte ( les 3 champs)) est affichée à l'écran ?
Est-ce que la procédure d'enregistrement d'une nouvelle carte se passe correctement sans erreur ?

Le code que tu montres ne ferait qu'afficher le carte dans la PictureBox et n'ajoute pas de carte à la base .
Pour ajouter une carte il faut passer par le bouton "Enregistrement" avec EditMode à False je pense . EditMode est à True lorsque vous voulez modifier une carte .

Autre chose : tu t'es inscrit sur codes-Sources il n' y a pas longtemps . Quel serait ton niveau en programmation VB NET ? Est-ce ton premier projet ?
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020

Bonsoir,
Oui vous avez raison quand j'enregistre une nouvelle carte, ne s'ajoute pas à la base, ainsi que la carte est affichée dans la Picturebox1 avant son enregistrement.
Quand je reviens à la base dans la table carte je ne trouve pas de carte, la table des cartes (avec son nom, son aera et sa carte ( les 3 champs)) ne s'affiche pas dans l'écran.
pouvez vous m'aider afin que je puisse les ajouter à la base.

Mon niveau de programmation est débutant et c'est mon premier projet dans le cadre du cours de conception et gestion de base de données.

Merci d'avance.

Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020
109
Salut
Codes-sources était en panne ( on ne pouvait pas accéder au serveur avec son compte) alors excuses pour le retard .
Tu es débutant et j'ai la vague impression que tu as mis la charrue avant les bœufs .
voici un excellent cours même si celui-ci date un peu : il te donnera des bases solides pour progresser ensuite : https://plasserre.developpez.com/cours/vb-net
C'est mon "livre" de chevet question programmation .
Maintenant plusieurs choses
1) le problème est que je n'y connais pas grand chose en base de données et de plus celle que tu utilises m'est totalement inconnue .
2) J'ai remarqué que ton projet contenait plusieurs Form (AddBVForm, AddCarteDouars, AddSbv et DisplayCarte ) : je pense que tu as des soucis au niveau des interactions entre les différents objets de ces 4 Forms . Utilises-tu des classes pour définir des objets ( exemple une classe ClassBassin pour définir un objet "Bassin" avec ses propriétés, ses méthodes et ses évènements ) . La programmation objet est la base d'un projet rigoureux, bien construit et aisé à maintenir .
3) A mon avis il faudrait , une fois que tu auras assimilé le cours que je t'ai donné, repartir de zéro avec déjà une seule Form pour pouvoir gérer la base de données et donner la possibilité de modifier ou de rajouter un enregistrement . Ensuite une autre Form appelée par la première pourrait être envisagée pour modifier une image d'un bassin avec enregistrement dans la base au retour vers la première Form . Et l'utilisation d'une classe pou gérer les propriétés d'un objet "Bassin" serait plus que souhaitable .
4) Je ne sais nullement combien d'enregistrements au maximum ta base de données aura à gérer ni si celle-ci ne comporte qu'une table ou plus .Si il n'y a qu'une table et peu d'enregistrements une BDD me semble superflue .
5) Maintenant t'aider on veut bien mais nous ne sommes pas dans ta tête ce qui fait que nous vons du mal à être avec toi sur la même longueur d'onde .
6) Les difficultés que tu as ne sont pas des difficultés isolées et bien précises mais me semblent déjà être un souci d'architecture générale de ton projet .
Maintenant je ne sais nullement quoi faire pour faire avancer le schmilblic comme on dit .
Avec toutes mes espérances pour la suite de ton projet
Messages postés
19
Date d'inscription
jeudi 21 mai 2020
Statut
Membre
Dernière intervention
27 mai 2020
>
Messages postés
2156
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 mai 2020

Bonsoir,
Je vous remercie pour le cours et pour les efforts que vous avez fourni pour m'aider.