Optimisation code VB.net avec requetes SQL multi tables

Signaler
Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014
-
Messages postés
33126
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 juillet 2021
-
Bonjour,
je souhaite rediger un code avec des Requetes en SQL en vb.net pour remplir un datagridview d'après plusieurs tables :

1- Remplir les entetes de colonnes avec une liste dans la table [HISTO]
2- Remplir la premiere colonne 'Noms' avec les noms de la table [SPV]
3- Remplir les cellules avec les dates les plus recentes des tables [HISTO] + [VM] + [NOMINATION]

Voici mon code avec mes differentes requetes mais ca met un certain temps a s'executer :



'----------------Remplissage des entetes de colonnes-----------------
DataGridView1.Columns.Add("NOM", "NOM")
DataGridView1.Columns(0).Frozen = True
DataGridView1.Columns.Add("GRADE", "GRADE")
DataGridView1.Columns.Add("DATE", "DATE")
DataGridView1.Columns.Add("VM", "VM")

mySelectquery = "SELECT distinct FORMATION from [HISTO] where recu='O'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
DataGridView1.Columns.Add(dtaRead.GetValue(0).ToString, dtaRead.GetValue(0).ToString)
End While

dtaRead.Close()
MyConnection.Close()

'-----------------------Remplissage des lignes-----------------------
mySelectquery = "SELECT distinct NOM from [SPV] WHERE ACTIF='O'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
DataGridView1.ROWS.Add(dtaRead.GetValue(0).ToString)
End While

dtaRead.Close()
MyConnection.Close()

'---------------------Remplissage des cellules---------------------

'-----Grade + Date_Nomination-----
For i As Integer=1 To DataGridView1.Rows.Count-2
Dim t As date="01/01/1900"
mySelectquery = "SELECT distinct N.Grade,N.Date_NOMINATION from [NOMINATION] N WHERE N.NOM='" & datagridview1.Rows(i).Cells(0).value & "'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
If CDate(dtaRead.GetValue(1).ToString)>CDate(t.ToString) Then
t=CDate(dtaRead.GetValue(1).ToString)
DataGridView1.ROWS(i).Cells(1).value=dtaRead.GetValue(0).ToString
DataGridView1.ROWS(i).Cells(2).value=Format(month(dtaRead.GetValue(1).ToString),"00") & "/"& microsoft.VisualBasic.Right(year(dtaRead.GetValue(1).ToString),2)
End if
End While

dtaRead.Close()
MyConnection.Close()
Next


'-----VM-----
For i As Integer=1 To DataGridView1.Rows.Count-2
Dim t As date="01/01/1900"
mySelectquery = "SELECT distinct Date_VM from [VM] WHERE NOM='" & datagridview1.Rows(i).Cells(0).value & "'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
If CDate(dtaRead.GetValue(0).ToString)>CDate(t.ToString) Then
t=CDate(dtaRead.GetValue(0).ToString)
DataGridView1.ROWS(i).Cells(3).value=Format(month(dtaRead.GetValue(0).ToString),"00") & "/"& microsoft.VisualBasic.Right(year(dtaRead.GetValue(0).ToString),2)
End if
End While

dtaRead.Close()
MyConnection.Close()
Next

'-----Formation-----
For i As Integer=1 To DataGridView1.Rows.Count-2
Dim t As date="01/01/1900"
For j As Integer=4 To DataGridView1.ColumnCount-1

mySelectquery = "SELECT distinct FIN from [HISTO] WHERE RECU='O' and NOM='" & datagridview1.Rows(i).Cells(0).value & "' and FORMATION='" & datagridview1.columns(j).HeaderText & "'"

ConnectionBDD()
dtaRead = MyCommand.ExecuteReader()

While dtaRead.Read()
If CDate(dtaRead.GetValue(0).ToString)>CDate(t.ToString) Then
t=CDate(dtaRead.GetValue(0).ToString)
DataGridView1.ROWS(i).Cells(j).value=microsoft.VisualBasic.Right(year(dtaRead.GetValue(0).ToString),2)
End if
End While

dtaRead.Close()
MyConnection.Close()
Next
Next


Je ne sais pas faire un code plus simple et plus efficace pour arriver à faire la meme chose.
Quelqu'un pourrait me donner un coup de pouce? Merci d'avance!

3 réponses

Messages postés
33126
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 juillet 2021
351
Bonjour,

Le souci est que tu utilises plusieurs requêtes et qu'en plus tu en utilises certaines dans une boucle...
Donc... ton programme ouvre/ferme des connexion à ta BDD...l'interroge...plusieurs fois....

En règle générale on essai de faire UNE seule requête qui récupère toutes les données et Ensuite on les manipules... comme ça on ne fait qu'UN seul accès à la BDD...
Pour faire ce genre de requête il faut utiliser des jointures..






Messages postés
9
Date d'inscription
jeudi 4 septembre 2014
Statut
Membre
Dernière intervention
14 septembre 2014

Merci pour ta réponse,
J'ai essayé de faire un requete avec jointure mais je n'y suis pas arrivé, idem avec la fonction pivot...
Penses tu pouvoir m'aider?
Messages postés
33126
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 juillet 2021
351
Penses tu pouvoir m'aider?
T'aider ? .. oui surement...
Mais pour ça... il nous faut plusieurs choses :

1 - La structure de tes tables ( avec quelques exemples de données si possible)

J'ai essayé de faire un requete avec jointure
2 - Que tu nous montre la/les requête(s) que tu as essayé pour qu'on puisse éventuellement te la corriger.

mais je n'y suis pas arrivé,
3 - Que tu nous dises ce que tu as obtenu et en quoi cela n'a pas fonctionné ?



NB: Bien entendu... tu as testé ta requête EN DIRECT dans ta BDD ??
Déjà pour t'assurer qu'elle te retournait bien les informations nécéssaires ensuite pour les afficher...????....