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 :

Déterminer rapidement si une table SQL liée par ODBC est disponible


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [Résolu] Déterminer rapidement si une table SQL liée par ODBC est disponible
    Mon application doit pouvoir déterminer rapidement si une table SQL liée par ODBC est disponible. Le problème actuel est que si le serveur SQL n'est pas en ligne (panne serveur ou réseau par exemple), l'ouverture d'un recordset tourne plus de 6 minutes sur la ligne "Set MyRs..." avant de retourner un code d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Mydb As Database, MyRs As Recordset
    Set Mydb = CurrentDb
    Mydb.QueryTimeout = 1
    Set MyRs = Mydb.OpenRecordset("Select IdLiv from dbo_Livraison")
    L'erreur est "erreur d'exécution 3151", "ODBC -- Echec de la connexion à 'c:\monDsn.dsn'"

    J'ai besoin de pouvoir déterminer en quelques secondes la disponibilité du serveur SQL afin de traiter l'erreur et ne pas bloquer l'utilisateur pendant 5 minutes, soit en définissant un temps max d'attente soit avec une fonction qui donne une réponse rapide sur la disponibilité de SQL Server.

    Un grand merci d'avance pour votre aide.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Tente une connexion avec ADO :
    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
    Public Sub ADOInitConnection()
        On Error GoTo Erreur
        Set lADO_Connection = New ADODB.Connection
        SysCmd acSysCmdSetStatus, "Connecting ..."
     
        If lStr_Base = "DEV" Then
            lADO_Connection.ConnectionString = "Driver={SQL Server};server=XX.XXX.X.XXX;UID=" & lStr_UID & ";PWD=" & lStr_PWD & ";database=" & lStr_Database & lStr_Base
        Else
            lADO_Connection.ConnectionString = "Driver={SQL Server};server=XX.XXX.X.XXY;UID=" & lStr_UID & ";PWD=" & lStr_PWD & ";database=" & lStr_Database & lStr_Base
        End If
        lADO_Connection.ConnectionTimeout = 10
        lADO_Connection.CommandTimeout = 10000
        lADO_Connection.Open
        SysCmd acSysCmdSetStatus, "Connection OK."
        Exit Sub
     
    Erreur:
        SysCmd acSysCmdSetStatus, Now & " - Connection KO. Attente de " & cINT_NB_MINUTES_ATTENTE_AVANT_TEST_RECONNECTION & " minutes avant nouveau test de connexion."
        'Debug.Print Now & " - " & Err.Number & " - " & Err.Description
        Attendre 60 * cINT_NB_MINUTES_ATTENTE_AVANT_TEST_RECONNECTION
        SysCmd acSysCmdSetStatus, " "
        ADOInitConnection
    End Sub
    Si pas de connection, gère l'erreur (au lieu de tenter une reconnection comme dans mon code).
    [Access] Les bases du débogage => ici

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Kloun Voir le message
    Tente une connexion avec ADO :
    Merci Kloun pour le tuyau. J'ai essayé d'implémenter comme ceci:

    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
    Public Sub ADOInitConnection()
        On Error GoTo Erreur
        Dim lADO_Connection
        Set lADO_Connection = New ADODB.Connection
        SysCmd acSysCmdSetStatus, "Connecting ..."
        lADO_Connection.ConnectionString = "FILEDSN=C:\Caisses\caissier2.dsn;DATABASE=Caisses;UID=caissier2;PWD=xyz"
     
        lADO_Connection.ConnectionTimeout = 1 '10
        lADO_Connection.CommandTimeout = 1 '10000
        Debug.Print Now
        lADO_Connection.Open
        Debug.Print Now
        SysCmd acSysCmdSetStatus, "Connection OK."
        Exit Sub
     
    Erreur:
        Debug.Print Now
        Stop
    End Sub
    Lorsque le serveur est accessible ça passe nickel en une fraction de seconde. Par contre si je désactive la connexion réseau sur le serveur SQL, ça bloque toujours pendant un peu plus de six minutes

    J'ai aussi regardé dans le dsn, je ne vois nulle part où régler un timeout.

    J'ai aussi essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lADO_Connection.ConnectionString = "Driver={SQL Native Client};server=191.250.10.57;UID=Caissier2;PWD=xyz;database=Caisses"
    ... même punition: 6 minutes et 18 secondes d'attente avant le verdict d'échec

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut le ping
    Bonjour,

    Je m'incruste pour proposer une alternative le ping
    je ne sais pas si cela pourrait convenir à ton souci

    2 solutions

    par un script là (d'autre solutions existent) :

    http://windowsitpro.com/article/arti...a-machine.html

    sinon dans access même et ici même
    là :
    http://access.developpez.com/sources...eseau#PingICMP

    Bon WE

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par naphta Voir le message
    Bonjour, Je m'incruste pour proposer une alternative le ping
    ...
    Bonjour Naphta, ton incrustation est bienvenue

    Oui c'est une bonne idée, qui donne rapidement réponse en cas de serveur SQL atteignable. Idéalement je voudrais cependant bien avoir une soluce qui couvre aussi les cas où par exemple le serveur tourne mais SQL ne répond pas.

    Bon week-end et merci !

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Le code ADO que j'ai vu dans cette discussion utilise ODBC comme fournisseur.

    Pour vraiment tester une méthode alternative il faudrait essayer un fournisseur SQL Server pour OLE DB.
    SQLOLEDB (7, 2000)
    SQLNCLI (2005)
    SQLNCLI10 (2008)

    Exemple avec SQLOLEDB
    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
    Dim oConn As ADODB.Connection
     
    Set oConn = New ADODB.Connection
    oConn.ConnectionString = "Provider=SQLOLEDB;" & _
          "Data Source=NomServeur;" & _
          "User ID=toto;Password=123456;" & _
          "Initial Catalog=BaseDeDonnees"
     
    oConn.ConnectionTimeout = 5
     
    On Error GoTo ErrH
    oConn.Open
    MsgBox "Connecté à BdD " & oConn.Properties("Current catalog")
    oConn.Close
     
    ExitHere:
    Set oConn = Nothing
    Exit Sub
     
    ErrH:
    MsgBox Err.Description, , "Err " & Err.Number
    Resume ExitHere
    A+

  7. #7
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut ODBCPING
    Bonsoir,

    Il y a aussi ODBCPing mais je suppose que tu as déjà testé, un utilitaire abandonné par Microsoft.

    ici sur le MSDN partie sql2008 pourtant.

    http://msdn.microsoft.com/fr-fr/library/ms162756.aspx


    Je ne l'ai jamais utilisé, d'habitude, en ce qui me concerne, quand un serveur est pas disponible pour une raison ou une autre les utilisateurs se concertent (assez brièvement) puis finissent pas me passer un coup de bigo.

    a+

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    LedZepII :
    OLE/ODBC, y'a une différence de rapidité dans l'accès au données ?
    [Access] Les bases du débogage => ici

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    Pour vraiment tester une méthode alternative il faudrait essayer un fournisseur SQL Server pour OLE DB.
    Bonjour LedZeppII. Merci pour l'exemple. J'ai implémenté, ça fonctionne impeccable quand la base est dispo, ça donne rapidement un message d'erreur sir par exemple le mot de passe est faux... mais j'ai tjrs des soucis (là ça plante définitivement Access) si le serveur n'est pas accessible sur le réseau. Je pense que je vais me tourner vers une routine en 2 phases, 1° vérif par ping puis 2° check selon ton exemple. Merci et A+

  10. #10
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Citation Envoyé par Kloun Voir le message
    LedZepII :
    OLE/ODBC, y'a une différence de rapidité dans l'accès au données ?
    Non, je ne crois pas.
    En revanche, comme ce sont des méthodes logicielles différentes, je me disais qu'il pourrait y avoir une gestion différente du timeout.

    A+

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/08/2013, 12h19
  2. [MySQL] Tables SQL liées par une date
    Par Aiglichon dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/04/2013, 17h05
  3. Affichage de données sql liées par une clé externe
    Par Lazarey dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/04/2008, 13h35
  4. Réponses: 5
    Dernier message: 14/03/2007, 00h09
  5. Table Access Liée à SQL Server par ODBC
    Par PORTES dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/03/2006, 12h18

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