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

Macros et VBA Excel Discussion :

Connexion BDD ACCDB sur réseau local


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 9
    Par défaut Connexion BDD ACCDB sur réseau local
    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

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Un Recordset.RecordCount va logiquement lire tout le jeu d'enregistrement pour pouvoir te dire combien il y a d'enregistrements. Dès lors, oui, tu vas forcément charger toute ta base.

    Avec Access, il n'y a aucun traitement côté serveur, de sorte que si tu cherches un enregistrement pour en retirer la valeur d'un seul champ, tu vas quand même charger un paquet de données puisque le moteur est côté client. Dans ce cas, je peux imaginer qu'une connexion à une clé usb soit plus rapide qu'une connexion réseau.

    A quoi te sert-il de compter les enregistrements. C'est une opération assez chronophage avec Access. De plus, je ne comprends pas bien tes redim. Adodb.Recordset expose la méthode GetRows qui renvoie un tableau transposé, et tu peux utiliser également Range.CopyFromRecordset qui te place les données dans ta plage (qui doit être redimensionnée). Ca permet de récupérer le recordset en un coup, puis de couper ta connexion et de travailler en local.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/09/2020, 19h14
  2. Java et connexion BDD SQLite sur une VM
    Par Cdébryha dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 07/05/2013, 17h38
  3. Connexion à une BDD installée sur un server
    Par papse dans le forum JDBC
    Réponses: 6
    Dernier message: 30/04/2010, 18h19
  4. Connexion BDD sur autre pc via jdbc
    Par tentsuken dans le forum JDBC
    Réponses: 5
    Dernier message: 02/07/2009, 13h03
  5. pb connexion bdd via hibernate sur tomcat
    Par aurelientp dans le forum Hibernate
    Réponses: 10
    Dernier message: 25/01/2008, 21h32

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