IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Upload Fichier + Insert Mysql + Listbox


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut Upload Fichier + Insert Mysql + Listbox
    Salut,

    J'ai une Listbox ou je fais du DragDrop.
    Celle-ci m'affiche le chemin du fichier.

    Avec le bouton save je voudrais uploader pour chaque lien le fichier mais je trouve pas la soluce

    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
    Imports MySql.Data.MySqlClient
    Imports System.Configuration
    Imports System.IO
    Public Class Form2
        Dim MysqlConn As MySqlConnection
        Dim COMMAND As New MySqlCommand
        Dim READER As MySqlDataReader
        Private Sub Form2_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
            Dim droppedItems As String() = e.Data.GetData(DataFormats.FileDrop)
            For Each file In droppedItems
                Dim filename = GetFileName(file)
                ListBox1.Items.Add(filename)
                'MessageBox.Show("You Dropped " + filename)'
            Next
     
        End Sub
     
        Private Sub Form2_DragEnter(sender As Object, e As DragEventArgs) Handles Me.DragEnter
            If e.Data.GetDataPresent(DataFormats.FileDrop, False) = True Then
                e.Effect = DragDropEffects.All
            End If
        End Sub
     
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            MysqlConn = New MySqlConnection(ConfigurationManager.ConnectionStrings("xCollectibles.My.MySettings.xcollectiblesConnectionString").ToString)
        End Sub
     
        Public Function GetFileName(path As String)
            'Return System.IO.Path.GetFileNameWithoutExtension(path)'
            Return System.IO.Path.GetFullPath(path)
        End Function
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim conn As MySqlConnection
     
            conn = New MySqlConnection(ConfigurationManager.ConnectionStrings("xCollectibles.My.MySettings.xcollectiblesConnectionString").ToString)
     
     
            Try
                conn.Open()
            Catch Myerror As MySqlException
                MsgBox("Error connection to the database!")
     
            End Try
            Dim adapter As New MySqlDataAdapter
            Dim sqlquery = "insert into xcollectibles.foto (foto) values (@foto)"
            Dim myCmd As New MySqlCommand
            myCmd.Connection = conn
            myCmd.CommandText = sqlquery
            myCmd.Parameters.AddWithValue("@foto", ListBox1.Items)
     
     
            adapter.SelectCommand = myCmd
            Dim mydata As MySqlDataReader
            mydata = myCmd.ExecuteReader
     
            For Each item In ListBox1.Items
     
            Next
     
     
        End Sub
    End Class
    Merci de votre aide....

  2. #2
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Bonjour,

    Quelques remarques générales:
    • Tu déclares 2 fois la connexion à ta base MySQL (dans Form2_Load, puis dans Button1_Click).
    • Il est de bonne pratique d'utiliser la directive Using pour les connexions aux BDD ( et pour les objets qui implémentent IDisposable en général).
    • Il est d'encore meilleure pratique de séparer les couches de ton application: au moins une pour l'interface, une pour les actions de base de données. Crée une nouvelle classe pour gérer cela.
    • Pour faire un INSERT, tu n'as pas besoin d'adapter ni de reader. Tu prépares ta commande, et tu utilises ExecuteNonQuery(). Regarde cet exemple, à la fois pour using et pour executenonquery.



    Le plus important: tu veux mettre quoi dans ta base? seulement le nom du fichier ou tout son contenu? quel est le type de ta colonne foto? Egalement, combien d'objets penses-tu que l'utilisateur voudra uploader en un lot (cela influera sur la méthode à choisir: peu d'objets = un INSERT par objet, facile à mettre en oeuvre mais peut être plus lent, beaucoup d'objets = un INSERT pour tous, plus rapide mais plus difficile à mettre en oeuvre, surtout avec des blobs).

    Regarde ici un exemple d'insert par lot. C'est en C#, mais tu convertiras facilement en VB.

    Et pour finir, je pense que tu auras plus de chances si tu poses ta question sur le forum VB.NET. Certes, c'est une application Winforms, mais cela concerne plus le langage que l'interface.
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par nouanda Voir le message

    Le plus important: tu veux mettre quoi dans ta base? seulement le nom du fichier ou tout son contenu? quel est le type de ta colonne foto? Egalement, combien d'objets penses-tu que l'utilisateur voudra uploader en un lot (cela influera sur la méthode à choisir: peu d'objets = un INSERT par objet, facile à mettre en oeuvre mais peut être plus lent, beaucoup d'objets = un INSERT pour tous, plus rapide mais plus difficile à mettre en oeuvre, surtout avec des blobs).
    En fait quand je glisse le ou les fichiers dans le listbox, il met le lien du fichier du genre "c:\mes images\image.jpg" d'ou le Return System.IO.Path.GetFullPath(path)

    Le bouton save envoi image.jpg qui est dans la listbox se trouvant dans "c:\mes images\image.jpg".
    Si la listbox a plusieurs items du genre, "c:\mes images\image1.jpg", "c:\mes images\image2.jpg", etc.....
    Ainsi il sauvegarde tous les fichiers dans la BD. En général c'est maxi 40 photos d'un coup. Et oui c'est Blob. C'est pour éviter de mettre une image une par une. Je crois que ma méthode pour insérer n'est pas correct sa j'en suis sure. J'ai beau chercher sur divers forum et je vois personne utiliser cette méthode.

    Merci.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    Si c'est pour une grosse quantité d'image je ne conseillerais pas de faire du blob. Les blobs c'est bien mais on peut souvent faire mieux plus simplement, disons qu'il faut que ce soit bien réfléchit.
    Ainsi tu pourrais avoir un dossier accessible sur ton serveur que te serviras à sauvegarder tes fichiers. Tu pourrais directement copier le fichier lors du drag and drop, et un GetFiles(..) te fourniras la liste des fichiers présents.
    Maintenant tu peux également te servir en parallèle de ta bdd pour stocker le nom des fichiers et faire un peu de gestion.

    Tu as peut être de très bonne raison de faire avec des blobs, et ça marcheras sans problème. Mais souvent c'est beaucoup plus simple de passer par le système de fichier (qui en faite est une bdd spéciale fichiers quelques part )

    Bon code,
    J@ck.
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Ou alors quelqu'un peu me dire comment uploader plusieurs fichiers d'un coup dans une DB avec vb net ?
    Je suis preneur

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Citation Envoyé par nouanda Voir le message
    [..]
    • Pour faire un INSERT, tu n'as pas besoin d'adapter ni de reader. Tu prépares ta commande, et tu utilises ExecuteNonQuery(). Regarde cet exemple, à la fois pour using et pour executenonquery.
    [..]
    Attention, superthx possède un clavier incapable de saisir ExecuteNonQuery.

    Allez, bonne chance à superthx ... et aussi aux helpers
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    Attention, superthx possède un clavier incapable de saisir ExecuteNonQuery.

    Allez, bonne chance à superthx ... et aussi aux helpers
    Hahaha, meme pas drôle.

    Sérieux j'ai essayer ExecuteNonQuery et c'est surligneur en rouge comme quoi sa merde.

    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
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                MysqlConn.Open()
            Catch Myerror As MySqlException
                MsgBox("Error connection to the database!")
    
            End Try
            Dim adapter As New MySqlDataAdapter
            Dim sqlquery = "insert into xcollectibles.foto (foto) values (@foto)"
            Dim myCmd As New MySqlCommand
            myCmd.Connection = MysqlConn
            myCmd.CommandText = sqlquery
            myCmd.Parameters.AddWithValue("@foto", ListBox1.Items)
    
    
            'adapter.SelectCommand = myCmd'
            'Dim mydata As MySqlDataReader'
            READER = COMMAND.ExecuteNonQuery()
    
            For Each item In ListBox1.Items
    
            Next
    
            MysqlConn.Dispose()
    
        End Sub
    End Class
    Malheureusement je ne comprends pas pourquoi. Donc c'est casse co**lle. Même si je suis debutant et que j'essai tant bien que mal de faire mes petits programmes.

    Le truc que je voulais c'est savoir comment uploader plusieurs fichiers dans une BD (dans mon cas Mysql). Rien a foutre de la taille des fichiers, en general pas plus de 5Mo. Y'a plein d'exemple sur le net pour uploader un fichier (1 fichier) photo ou autres. Mais rien qui dit comment uploader + de 2 fichiers

    J'ai des petits programme qui marchent bien pour mes petits truc de tous les jours. Mais déjà si sa marche pas pour l'upload j'abandonne.

  8. #8
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Re,

    c'était une blague faut pas le prendre mal !
    Toutefois tu n'as pas dû regarder mon dernier message dans la discussion précédente où je dis exactement ce qu'il faut faire (pour le précédent problème ; j'ai pas lu celui-ci).
    Ensuite l'erreur que tu m'avais remontée était dû à une mauvaise utilisation de la fonction.
    Celle que tu présentes ici n'est toujours pas bonne.

    ExecuteNonQuery retourne un entier (int), tu ne peux donc pas affecter son résultat à un DataReader.

    Deux petites astuces :
    - dans Visual Studio, quand tu passes la souris sur le mot souligné en rouge, une info-bulle apparaît et te dit l'origine du problème,
    - pour savoir comment fonctionne une classe/attribut/méthode, regarde les info sur le site de la MSDN, ça aide grandement.

    Bonne continuation
    Plus je connais de langages, plus j'aime le C.

  9. #9
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Essaie ça. Je n'ai ni VB ni MySQL sous la main, donc pas testé...

    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
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            Try
                MysqlConn.Open()
            Catch Myerror As MySqlException
                MsgBox("Error connection to the database!")
     
            End Try
     
            For Each item In ListBox1.Items
                Try
                    fs = New FileStream(item.ToString(), FileMode.Open, FileAccess.Read)
                    FileSize = fs.Length
                    rawData = New Byte(FileSize) {}
                    fs.Read(rawData, 0, FileSize)
                    fs.Close()
     
                    Sql = "INSERT INTO xcollectibles.foto VALUES(?File)"
                    myCmd.Connection = MysqlConn
                    myCmd.CommandText = Sql
                    myCmd.Parameters.Add("?File", rawData)
                    If (myCmd.ExecuteNonQuery()!= 1) Then Throw New Exception("An exception has occurred.")
                Catch //a toi de jouer
                    End Try
            Next
     
            MysqlConn.Dispose()
     
        End Sub
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    On avance bien.... J'ai modifier le code

    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
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim cmd As New MySqlCommand
            Dim SQL As String
            Dim FileSize As UInt32
            Dim i As Integer
            For i = 0 To Me.ListBox1.Items.Count - 1
                Me.ListBox1.SetSelected(i, True)
                Dim rawData() As Byte = IO.File.ReadAllBytes(ListBox1.SelectedItem)
                Dim fs As FileStream
                Try
                    fs = New FileStream(ListBox1.SelectedItem, FileMode.Open, FileAccess.Read)
                    FileSize = fs.Length
                    rawData = New Byte(FileSize) {}
                    fs.Read(rawData, 0, FileSize)
                    fs.Close()
                    MysqlConn.Open()
                    SQL = "INSERT INTO xcollectibles.foto (foto) VALUES(@foto)"
                    cmd.Connection = MysqlConn
                    cmd.CommandText = SQL
                    cmd.Parameters.AddWithValue("@foto", rawData)
                    cmd.ExecuteNonQuery()
                    MessageBox.Show("File Inserted into database successfully!",
                    "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
                    MysqlConn.Dispose()
                Catch ex As Exception
                    MessageBox.Show("There was an error: " & ex.Message, "Error",
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
                End Try
            Next
        End Sub
    Pour le premier item de la listbox sa passe,
    Par contre pour les suivants j'ai une erreur "There was an error: Parameter '@foto' has already been defined"
    et ensuite There was an erroe: The connection is already open."

    C'est peut etre qu'il me peux pas clore la session ou autre........ Une idée ????

  11. #11
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Les erreurs remontées sont plutôt explicites :

    - @foto déjà défini : tu instancies ta commande avant la boucle, donc à chaque itération de ta boucle tu ajoutes ce même paramètre à une même commande. Soit tu instancies une nouvelle commande à chaque itération, soit tu ajoutes le paramètre avant la boucle, et dans la boucle tu ne fais que changer sa valeur.

    - connexion déjà ouverte : un peu le même souci. A chaque itération tu fais un Open sans le Close derrière. Toujours deux possibilités : soit tu open/close pour chaque itération, soit tu open avant la boucle et tu close après.

    Enfin, je suis pas sûr que ta requête soit correcte.
    C'est "INSERT INTO maTable (monChamp) VALUES (maValeur)".
    Là j'ai l'impression que tu as écrit "INSERT INTO maTable.monChamp ..."
    Plus je connais de langages, plus j'aime le C.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Points : 112
    Points
    112
    Par défaut
    Ok, j'ai réussi pas de truc depuis la dernière fois.

    Mais au sujet des upload d'image........
    Quand je upload certains jpg, ils sont comme entrecoupe.
    Et certains png avec fond transparent, le fond transparent fais comme une sorte de mosaïque.

    Qu'est ce qui cloche ?

    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
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            MysqlConn.Open()
            Me.Cursor = Cursors.WaitCursor
            For i = 0 To Me.ListBox1.Items.Count - 1
                ProgressBar1.Maximum = Me.ListBox1.Items.Count - 1
                Me.ListBox1.SetSelected(i, True)
                Dim cmd As New MySqlCommand
                Dim SQL As String
                Dim filesize As UInt32
                Dim mstream As New System.IO.MemoryStream()
                PictureBox1.Image.Save(mstream, Imaging.ImageFormat.Jpeg)
                Dim arrImage() As Byte = mstream.GetBuffer()
                filesize = mstream.Length
                mstream.Close()
                SQL = "INSERT INTO xcollectibles.foto (id_product,foto) VALUES ((Select id from xcollectibles.product where product.name='" & ComboBox1.Text & "'), @foto) "
                ProgressBar1.Value = i
                cmd.Connection = MysqlConn
                cmd.CommandText = SQL
                cmd.Parameters.AddWithValue("@foto", arrImage)
                cmd.ExecuteNonQuery()
            Next
            MessageBox.Show("File Inserted into database successfully!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
            MysqlConn.Dispose()
            ProgressBar1.Value = 0
            Me.Cursor = Cursors.Default
        End Sub

Discussions similaires

  1. Upload fichier et insertion mysql
    Par nkordiko dans le forum jQuery
    Réponses: 2
    Dernier message: 03/01/2011, 23h38
  2. [MySQL] Fromulaire pour upload fichier + insertion dans la base de données MySQL
    Par WPH2009 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2009, 21h09
  3. Upload et insertion multiple de fichier
    Par titou_777 dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2009, 11h21
  4. [MySQL] upload photo php-mysql - effacer fichier sur ftp
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/02/2009, 16h00
  5. Upload multiple + insert du nom dans MySQL
    Par abrioit dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2009, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo