Optimisation code VB.net avec requetes SQL multi tables

kaelinou Messages postés 9 Date d'inscription jeudi 4 septembre 2014 Statut Membre Dernière intervention 14 septembre 2014 - Modifié par kaelinou le 13/09/2014 à 08:59
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 - 14 sept. 2014 à 15:28
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

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
13 sept. 2014 à 12:00
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..






0
kaelinou Messages postés 9 Date d'inscription jeudi 4 septembre 2014 Statut Membre Dernière intervention 14 septembre 2014
14 sept. 2014 à 09:19
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?
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
14 sept. 2014 à 15:28
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...????....
0
Rejoignez-nous