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

VBA Access Discussion :

ADO - MS SQL Server, empecher un time out sans changer les parametres ? [AC-2016]


Sujet :

VBA Access

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut ADO - MS SQL Server, empecher un time out sans changer les parametres ?
    Bonjour a vous et merci de votre temps et de votre aide.

    J'ai une application Access qui utilise in BD MS SQL Server pour ses donnees et une partie de ses traitements.
    Mon probleme est que j'ai un time out d'une minute sur ma connexion, donc si je depasse ce temps de traitement du cote de SQL, j'ai une erreur dans Access.
    Je ne peux pas (c'est interdit par ma compagnie) changer la duree du time out. C'est 1 mn pas une seconde de plus.

    Pour lancer mes traitements j'utilise :

    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
    Public Sub ExecuteExec(prmStoredProcName As String, ParamArray prmStoredProcParam() As Variant)
        'Call a store procedure executing something
        Dim storedProcConnection As New ADODB.Connection
        Call storedProcConnection.Open("MonDSN")
     
        Dim execCmd As String
        Dim execParam As String
     
        Dim p As Variant: For Each p In prmStoredProcParam
            If execParam <> "" Then
                execParam = execParam & ", "
            End If
     
            execParam = execParam & p
        Next p
     
        Dim db As DAO.Database: Set db = CurrentDb
        execCmd = db.QueryDefs(prmStoredProcName).SQL & " " & execParam
        db.Close: Set db = Nothing
     
        Dim cmd As New ADODB.Command
     
        With cmd
            .ActiveConnection = storedProcConnection
            .CommandText = execCmd
            .CommandType = adCmdText
            .Execute
        End With
     
        Set cmd = Nothing
     
        Call storedProcConnection.Close:  Set storedProcConnection = Nothing
    End Sub
    Et pour les requetes de selection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub OpenSelectConnection()
     
        If m_SelectConnection Is Nothing Then
            Set m_SelectConnection = New ADODB.Connection
            Call m_SelectConnection.Open("MonDSN")
        End If
     
    End Sub
    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
    Private Function ExecuteSelect(prmStoredProcName As String, ParamArray prmStoredProcParam() As Variant) As ADODB.Recordset
        'Call a stroed procedure returning a recordset
        Call OpenSelectConnection
     
        Dim execCmd As String
        Dim execParam As String
     
        Dim p As Variant: For Each p In prmStoredProcParam
            If execParam <> "" Then
                execParam = execParam & ", "
            End If
     
            execParam = execParam & p
        Next p
     
        Dim db As DAO.Database: Set db = CurrentDb
        execCmd = db.QueryDefs(prmStoredProcName).SQL & " " & execParam
        db.Close: Set db = Nothing
     
        Dim result As New ADODB.Recordset
     
        With result
            .ActiveConnection = m_SelectConnection
            .Source = execCmd
            .LockType = adLockOptimistic
            .CursorType = adOpenKeyset
            .CursorLocation = adUseClient
            .Open
        End With
     
        Set ExecuteSelect = result: Set result = Nothing
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub CloseSelectConnection()
     
        If Not m_SelectConnection Is Nothing Then
            Call m_SelectConnection.Close
            Set m_SelectConnection = Nothing
        End If
     
    End Sub
    Je peux changer ce code au besoin.

    Ma BD a des tables liees dans SQL server.

    Ma question est : connaissez vous un moyen pour empecher le time out sans toucher au parametrage de la connexion.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Regardes si tu trouves ce que tu cherches dans cette source.

    Mais je modifie le time out !

    https://www.developpez.net/forums/d1...a/#post9283354

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Merci dysorthographie.

    Cela ressemble a ce que je fais actuellement, mais je note qu'on peut modifier localement le time out.
    A priori je n'aurai pas le droit de le faire mais c'est bon a savoir.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Ceci dit vérifies le time out local de ta connexion rien ne dit quelle soit a une second????

    De toutes les façons ça ne modifiera pas les limites imposées par le serveur.

    Après tout 1000/1000 ça fait 1 seconde!
    Dernière modification par Invité ; 25/10/2018 à 16h28.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bonjour.

    J'ai quand meme toute une minute, pas seulement 1s de time out. C'est deja assez contraignant comme cela.

    il semblerai que le time out ne se manifeste que sur les stored proc de type "select".
    Si j'execute un calcul qui ne retourne rien, j'ai pu le depasser sans probleme.
    Je suis en train de valider avec un GROS paquet de mes donnees pour voir si cela tient la charge mais il semblerai que j'ai trouve une piste de contournement de mon probleme.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Par défaut je pense que le time out d'adodb est entre 10 et 60 millisecondes, donc tu pourrais accessoirement le fixer à 60 000.

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bonjour.

    Comme je l'ai dit, je ne peux pas toucher (directement) au time out. Cela m'est explicitement interdit.

    A par cela c'est vraiment etrange.

    J'avais un message d'erreur fictif, juste pour faire du debugage, dans ma procedure stockee.
    Je l'ai enleve => Time out a environ 5mn.
    Je l'ai remis => Erreur d'execution au bout de 20mn environ mais pas de time out.
    On dirait que l'affichage de l'erreur maintient la conversation entre SQL et Access et que cela empeche le time out.

    Je continue mon exploration.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bonjour.

    Il semblerai que l'execution asynchrone resolve mon probleme :
    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
    Public Sub ExecuteExecAsynchronic(prmStoredProcName As String, ParamArray prmStoredProcParam() As Variant)
        'Call a store procedure executing something
        ' Do not wait SQL, but wait in Access
        Dim storedProcConnection As New ADODB.Connection
        Call storedProcConnection.Open("MaBD")
        
        Dim execCmd As String
        Dim execParam As String
        
        Dim p As Variant: For Each p In prmStoredProcParam
            If execParam <> "" Then
                execParam = execParam & ", "
            End If
        
            execParam = execParam & p
        Next p
        
        Dim db As DAO.Database: Set db = CurrentDb
        execCmd = db.QueryDefs(prmStoredProcName).SQL & " " & execParam
        db.Close: Set db = Nothing
        
        Dim cmd As New ADODB.Command
        
        With cmd
            .ActiveConnection = storedProcConnection
            .CommandText = execCmd
            .CommandType = adCmdText
            .Execute , , adAsyncExecute 'Do not wait MS SQL
        End With
        
        Do While cmd.State = adStateExecuting 'Wait until MS SQL says it has finished
            DoEvents
        Loop    
        Set cmd = Nothing
            
        Call storedProcConnection.Close:  Set storedProcConnection = Nothing
    End Sub
    J'ai pu calculer 5000 resultats en environ 1h sans que mon appli Access plante.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bonjour a tous.

    Le traitement asynchrone est ce que je cherchais.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Invité
    Invité(e)
    Par défaut
    bonjour,

    bon à savoir je n'y aurais pas pensé!

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bonjour a tous.

    Surprise (désagréable) ma super solution ne fonctionnait plus ce matin.

    Apres plusieurs essais, j'ai découvert qu'il fallait que j'ajoute 0 ma procédure stockée MS SQL Server:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @msg = 'Ici in message'; RAISERROR(@msg, 0, 1) WITH NOWAIT; -- Has to be there to prevent time-out on Access.

    Sinon Access time out pareil.

    J'avais mis ces messages en commentaire car ils servaient uniquement au debuggage, du moins je le croyais.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL SERVER 2005 - SSIS - time out et index de tables
    Par Negaton dans le forum Développement
    Réponses: 7
    Dernier message: 30/06/2010, 11h33
  2. ADO, MS SQL Server, TADOTable, TADOQuery, curseurs et perfomances
    Par okparanoid dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/05/2006, 12h52
  3. [VB6] ADO et SQL Server 2000 Exemples?
    Par Vesta dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/05/2006, 10h40
  4. Migration Access 97 vers SQL Server + Access Run Time
    Par KiDiBoo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/10/2005, 10h05
  5. Connexion ADO et SQL Server : délai d'execution expiré.
    Par denrette dans le forum Bases de données
    Réponses: 2
    Dernier message: 24/02/2004, 10h00

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