Bonjour,

je viens vers vous afin d'éclairer ma lanterne.
Après avoir fais des dizaines d'heures de recherches, je bloque un peu.

Projet en cours : création d'une application Excel avec l'utilisation d'une BDD .accdb Access.

Problème : lors de la mise en réseau du fichier .accdb, les lignes de codes suivantes prennent beaucoup de temps alors que sur une clef USB aucun soucis. Je suis dans tout les cas le seul utilisateur pour l'instant.
Je parle pour l'instant d'une simple requête SELECT.
Temps USB : instantané, temps sur réseau 1m10s environ.


  • Resultats.Open "REQUETE SQL", Connexion, 3
  • ExeSQL = Resultats.RecordCount


je l'ai remarqué avec le gestionnaire de tâche/réseau, lorsque une de ses lignes est exécutée, un pic apparaît :

Nom : Img1-Dvp.JPG
Affichages : 165
Taille : 20,1 Ko

Apres ce pic je peux exécuter plusieurs requêtes sans problème, la vitesse sera largement correcte pendant environs 20s après la dernière requête. Dès lors que j'utilise une requête plus de 20-30 secondes après la dernière, ça va tout recharger.

Si je ne me trompe pas, le fait exécuter une requête, toute la BDD se charge dans le cache de la machine quelque soit la requête (même avec .CursorLocation sur server)

Voici le code que j'utilise pour faire la connexion (provient d'un module de classe) :

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
 
Private Function ExeSQL(Requête As String, CheminBDD As String, TblxRequête() As Variant, Optional Head As Byte = 1) As Long
'FUNCTION D'EXECUTION DE REQUETES
 
Dim Connexion, Resultats As Object
Dim Dbrute As Variant
Dim NbrColonne, Colonne, ligne As Long
 
If Requête = "" Then Err.Raise vbObjectError + 3, , "Requête absente!"
 
On Error GoTo GestionErreur
 
Erase TblxRequête
 
'CONNEXION -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Set Connexion = CreateObject("ADODB.Connection")
 
With Connexion
 
        'ACCESS
        .Provider = "MSDASQL"
        .ConnectionTimeout = 30
 
        .Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & CheminBDD & mSecure
        .CursorLocation = 2
 
End With
'-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 
'EXECUTION REQUETE -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
If Left(Requête, 6) = "SELECT" Then
    Set Resultats = CreateObject("ADODB.Recordset")
 
    Resultats.CursorLocation = 2
    Resultats.Open Requête, Connexion, 3
 
    NbrColonne = Resultats.Fields.Count - 1
 
    If Head = 1 Then
        ReDim TblxRequête(NbrColonne, 0)
        For Colonne = 0 To NbrColonne
            TblxRequête(Colonne, 0) = Resultats.Fields(Colonne).Name
        Next Colonne
    End If
 
    ExeSQL = Resultats.RecordCount
 
        If Not ExeSQL = 0 Then
        If Head = 1 Then
            ReDim Preserve TblxRequête(NbrColonne, ExeSQL)
        Else
            ReDim TblxRequête(NbrColonne, ExeSQL - 1)
        End If
 
            ReDim Dbrute(NbrColonne, ExeSQL - 1)
            Resultats.MoveFirst
            Dbrute = Resultats.GetRows
            For Colonne = 0 To UBound(Dbrute, 1)
                For ligne = 0 To UBound(Dbrute, 2)
                    TblxRequête(Colonne, ligne + Head) = IIf(IsNull(Dbrute(Colonne, ligne)), "", Dbrute(Colonne, ligne))
                    TblxRequête(Colonne, ligne + Head) = RTrim(TblxRequête(Colonne, ligne + Head))
                    If TblxRequête(Colonne, ligne + Head) = "" And mAbsenceD <> "" Then TblxRequête(Colonne, ligne + Head) = mAbsenceD
                Next ligne
            Next Colonne
    End If
 
Else
    Connexion.Execute Requête
    ExeSQL = 0
End If
 
    Connexion.Close
'-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 
Set Resultats = Nothing
Set Connexion = Nothing
mderoul = True
On Error GoTo 0
 
Exit Function
GestionErreur:
    If Not Resultats Is Nothing Then If Resultats.State = 1 Then Resultats.Close
    If Not Connexion Is Nothing Then If Connexion.State = 1 Then Connexion.Close
    Set Resultats = Nothing
    Set Connexion = Nothing
    ExeSQL = -1
    Err.Raise vbObjectError + 3, , "!!! Erreur lors de l'execution de la requête. !!!" & Chr(10) & Chr(10) & _
    "Erreur N°" & Err.Number & Chr(10) & _
    "Description " & Err.Description
End Function
Quelque informations suplémentaires :

  • Sur une clef USB l'application fonctionne parfaitement sans latence.
  • J'ai compacté la base passant de 93 Mo a 43 Mo, je n'ai pas vu de changement, je pense que sa taille n'a pas d'influence (52 000 enregistrements et 96 champs).
  • Quelque soit le nombre de champs 1 ou tous, la vitesse d'execution n'a pas l'air de changer non plus.
  • Quelque soit la valeur de .CursorLocation je ne vois pas de changement particulier.
  • J'ai l'impression quand je met un espion sur "Resultats" que la connexion reste ouverte plus longtemps.
  • Le changement de la valeurs de ".ConnectionTimeout = 30" n'a pas lair de changer grand chose.
  • La vitesse du réseau est de 6,5 Mbits/s (800Ko/s).
  • J'ai mis en public les variables Connexion et Resultats en entête de module sans les mettre à nothing, mais aucun changement.


Il est difficile d'expliquer certaines chose que j'observe . PArfois je peux utiliser longtemps sans grand chargement, notamment quand je met un espion sur une variable recordset.
Je doute fortement qu'il y ait une solution miracle.

Merci d'avance de votre aide ou de votre simple interressement