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

VB.NET Discussion :

INSERT INTO, perte de performence avec DataGidView


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut INSERT INTO, perte de performence avec DataGidView
    Bonjour le forum et bon dimanche j'ai un datagridview qui m'affiche les salaires paramétrés par employé
    chaque mois je dois modifier le nombre de jour travailler par employé et fait une insertion de tout les employés dans la table salaire.
    le soucis est que lorsque je clique sur le bouton enregistré, en fonction du nombre de ligne, l'instruction insert peut prendre au-moins 20 à 30 minutes
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    For Each row As DataGridViewRow In dgvElementSalaire.Rows
                Call Connecter()
                cmd.CommandText = "select a.[IdUtilisateur] as [IdUtilisateur] from [dbo].[SALAIRE] a
    INNER JOIN [dbo].[UTILISATEUR] F ON F.IdUtilisateur=a.IdUtilisateur
    where f.LOGING='" & Label6.Text & "'"
                dv = cmd.ExecuteReader
                While dv.Read
                    Procedure.c = dv.Item("IdUtilisateur")
                End While
                dv.Close()
                txtIdutilisateur.Text = Procedure.c
                Call Connecter()
                cmd.Connection = con
                If row.Cells("BASE").Value.ToString = "" And row.Cells("NOMBRE").Value.ToString = "" And row.Cells("HORAIRE").Value.ToString = "" And row.Cells("TAUX").Value.ToString = "" Then
                    cmd.CommandText = "INSERT INTO [dbo].[SALAIRE]
    ([Date_Debut],[Date_Fin],[EM_ID],[SA_ID],[IDCOTISABLE],[IDNATURE],[IdUtilisateur],[MONTANT])
    VALUES(@Date_Debut,@Date_Fin,@EM_ID,@SA_ID,@IDCOTISABLE,@IDNATURE,@IdUtilisateur,@MONTANT)"
                    cmd.Parameters.Clear()
                    dgvElementSalaire.Refresh()
                    cmd.Parameters.Add("@Date_Debut", SqlDbType.DateTime)
                    cmd.Parameters.Add("@Date_Fin", SqlDbType.DateTime)
                    cmd.Parameters.Add("@EM_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@SA_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@IDCOTISABLE", SqlDbType.Int)
                    cmd.Parameters.Add("@IDNATURE", SqlDbType.Int)
     
                    cmd.Parameters.Add("@IdUtilisateur", SqlDbType.Int)
     
     
                    cmd.Parameters.Add("@MONTANT", SqlDbType.Decimal)
     
     
     
                    cmd.Parameters(0).Value = dtpDateDebut.Value
                    cmd.Parameters(1).Value = dtpDateFin.Value
                    cmd.Parameters(2).Value = row.Cells("EM_ID").Value
                    cmd.Parameters(3).Value = row.Cells("SA_ID").Value
                    cmd.Parameters(4).Value = row.Cells("IDCOTISABLE").Value
                    cmd.Parameters(5).Value = row.Cells("IDNATURE").Value
     
                    cmd.Parameters(6).Value = txtIdutilisateur.Text
     
     
                    cmd.Parameters(7).Value = Val(row.Cells("MONTANT").Value)
     
                    cmd.ExecuteNonQuery()
                Else
                    cmd.CommandText = "INSERT INTO [dbo].[SALAIRE]
    ([Date_Debut],[Date_Fin],[EM_ID],[SA_ID],[IDCOTISABLE],[IDNATURE],[IdUtilisateur],[BASE],[NOMBRE],[HORAIRE],[TAUX],[MONTANT])
    VALUES(@Date_Debut,@Date_Fin,@EM_ID,@SA_ID,@IDCOTISABLE,@IDNATURE,@IdUtilisateur,@BASE,@NOMBRE,@HORAIRE,@TAUX,@MONTANT)"
                    cmd.Parameters.Clear()
                    dgvElementSalaire.Refresh()
                    cmd.Parameters.Add("@Date_Debut", SqlDbType.DateTime)
                    cmd.Parameters.Add("@Date_Fin", SqlDbType.DateTime)
                    cmd.Parameters.Add("@EM_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@SA_ID", SqlDbType.Int)
                    cmd.Parameters.Add("@IDCOTISABLE", SqlDbType.Int)
                    cmd.Parameters.Add("@IDNATURE", SqlDbType.Int)
     
                    cmd.Parameters.Add("@IdUtilisateur", SqlDbType.Int)
                    cmd.Parameters.Add("@BASE", SqlDbType.Decimal)
                    cmd.Parameters.Add("@NOMBRE", SqlDbType.Decimal)
                    cmd.Parameters.Add("@HORAIRE", SqlDbType.Decimal)
                    cmd.Parameters.Add("@TAUX", SqlDbType.Decimal)
                    cmd.Parameters.Add("@MONTANT", SqlDbType.Decimal)
     
     
     
                    cmd.Parameters(0).Value = dtpDateDebut.Value
                    cmd.Parameters(1).Value = dtpDateFin.Value
                    cmd.Parameters(2).Value = row.Cells("EM_ID").Value
                    cmd.Parameters(3).Value = row.Cells("SA_ID").Value
                    cmd.Parameters(4).Value = row.Cells("IDCOTISABLE").Value
                    cmd.Parameters(5).Value = row.Cells("IDNATURE").Value
     
                    cmd.Parameters(6).Value = txtIdutilisateur.Text
                    cmd.Parameters(7).Value = Val(row.Cells("BASE").Value)
                    cmd.Parameters(8).Value = Val(row.Cells("NOMBRE").Value)
     
                    cmd.Parameters(9).Value = Val(row.Cells("HORAIRE").Value)
     
                    cmd.Parameters(10).Value = Val(row.Cells("TAUX").Value)
     
                    cmd.Parameters(11).Value = Val(row.Cells("MONTANT").Value)
     
                    cmd.ExecuteNonQuery()
                End If
                Call deconnecter()
     
            Next
            MsgBox("Ajout effectué avec succès")
     
            Call deconnecter()
    je voudrais savoir si c'est possible de faire mieux? si oui comment faire?

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,
    Si tu fais une mise à jour, intéresse toi à l'instruction UPDATE au lieu de INSERT. Tu ne devras pas faire de SELECT préalable, ce sera déjà un gain de temps. Sauf à avoir des milliers d'employés, la mise à jour devrait être presque instantanée.

  3. #3
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonjour Phil Rob j'ai deux tables une table pour le paramétrage des salaires (Repartitionsalaire) de chaque employé et une table de Saisi des salaires mensuels (Saisi des Salaire mensuel) maintenant chaque mois j'appel les données de la table RepartitionSalaire dans un datagriview j'apporte les modifications dans le datagridview et j'insert les données dans la table saisi des salaires mensuel.

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    OK, j'avais pas bien lu ton code
    Je ne peux guère t'aider dans ce cas mais je relève tout de même quelques bizarreries.
    Par exemple, dans le codes suivant, tu effectues 2 Call Connecter() sans aucun Call Deconnecter() : normal ?
    Dans ce code aussi (je ne sais pas ce qu'est Procedure.c), mais tu utilises ce code dans une boucle or, s'il s'agit d'une affectation, seule la dernière valeur atteinte par la boucle sera affectée à Procedure.c, est-il normal de faire une boucle à cet endroit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    For Each row As DataGridViewRow In dgvElementSalaire.Rows
                Call Connecter()
                cmd.CommandText = "select a.[IdUtilisateur] as [IdUtilisateur] from [dbo].[SALAIRE] a
    INNER JOIN [dbo].[UTILISATEUR] F ON F.IdUtilisateur=a.IdUtilisateur
    where f.LOGING='" & Label6.Text & "'"
                dv = cmd.ExecuteReader
                While dv.Read
                    Procedure.c = dv.Item("IdUtilisateur")
                End While
                dv.Close()
                txtIdutilisateur.Text = Procedure.c
                Call Connecter()
    Sur base de ton explication, ne serait-il pas commode d'écrire une procédure RempliDataGrid() qui ne ferait que cela, et puis une autre InsertLesLignesModifiees() ou InsertToutesLesLignes(), ces procédures ne faisant rien d'autre que ce qui est indiqué par leur nom ? L'intérêt serait d'avoir des codes plus simples (donc plus lisibles) et plus performants ?

    Désolé de ne pouvoir t'aider davantage. J'espère que mes commentaires te serviront ...

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Comment est créée la DataGridView ?

    Est-elle bindé à une gridsource ?
    Si oui, toute modification va générer un refresh de la gridview ce qui prend du temps.

    Une bonne solution est de se baser sur une datatable sur laquelle on opère les traitements et qu'on binde à la datagridview pour l'affichage.
    Évidement, au début d'un traitement sur de nombreuses rows, on enlève le binding et on le remet après la fin de traitement.

Discussions similaires

  1. Insert into une base access avec "OleDbConnection"
    Par milia dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 31/01/2007, 11h04
  2. Insert Into dans une table avec select
    Par smail25 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/12/2006, 13h06
  3. Réponses: 8
    Dernier message: 11/02/2006, 23h36
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39

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