[Astuce] Chargement très rapide d'une ListBox de type "Liste de valeurs" basée sur une requête SQL Server
Bonjour,
Alors déjà pour peupler la ListBox, il y a deux approches :
> Soit via son Rowsource par itération pour rentrer toute les valeurs
[CODE]
Code:
1 2 3 4 5 6 7 8 9
| Set Cn1 = New ADODB.Connection
Cn1.Open *** chaîne de connexion SQL Server ***
Set Rs = New ADODB.Recordset
chSQL = "SELECT Col1, Col2, ...., Colx FROM TABLE1"
Rs.Open chSQL, Cn1, adOpenForwardOnly, adLockReadOnly
If Not Rs.EOF Then
RS.Rowsource=RS.Rowsource & ";" & RS.Fields(0) & ";" & RS.Fields(1) & .....& ";" & RS.Fields(x) & ";"
End If
Rs.Close |
Ne pas oublier de retirer le dernier ";" dans le Rowsource !
> Soit via la commande .additem
Dans les deux cas, ce traitement peut être particulièrement long s'il y a pas mal de lignes et de colonnes à traiter.
Une astuce qui permet de booster drastiquement ce traitement consiste à déporter la pseudo itération de la première approche (celle avec Rowsource) sur le SQL Server en utilisant la clause FOR XML PATH (). Exemple :
Code:
1 2 3 4 5 6 7 8 9
| Set Cn1 = New ADODB.Connection
Cn1.Open *** chaîne de connexion SQL Server ***
Set Rs = New ADODB.Recordset
chSQL = "SELECT STUFF((SELECT ';' + Col1 + ';' + ';' + Col2 + ';' + .... + ';' + Colx FROM TABLE1 FOR XML PATH ('')), 1, 1, '')"
Rs.Open chSQL, Cn1, adOpenForwardOnly, adLockReadOnly
If Not Rs.EOF Then
ListeBox.Rowsource= Rq1.Fields(0)
End If
Rs.Close |
Attention : Le Rowsource est limité à seulement 32 750 caractères (2048 dans les anciennes versions) !!!!