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

Bases de données Delphi Discussion :

Problème: comment savoir si le service SQL Server est prêt?


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Problème: comment savoir si le service SQL Server est prêt?
    Bonjour,

    Je développe actuellement une application en Delphi 7 Entreprise avec une base de données SQL Server 2005 Express. J'utilise un TDatabase pour effectuer la liaison avec une source ODBC.

    Voici mon problème:
    Mon application démarre automatiquement au démarrage de Windows et elle doit afficher des messages en fonction de données qu'elle récupère dans la base de données (des rappels pour des dates de RDV). Cependant, au démarrage de l'ordinateur, l'application s'initialise avant que le service SQL Server ait eu le temps de démarrer, ce qui provoque donc une erreur de connexion. Il me faudrais un moyen de savoir si la connexion avec le serveur à distance est prête avant d'initialiser mon application.

    Si quelqu'un a une solution, je suis preneur!

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    je crois qu'une protection de la partie connexion avec un raise ferait l'affaire. je présume que tu utilises un composant ADO pour la connexion donc, à ta place je ferais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try
       compADO.connected := True;
    except
       raise 
    end;
    sinon tu pourrais toujours utilisé un socket de part et d'autre qui te préviendrais de la réussite ou l'échoue de la connexion.

    si ni l'une ni l'autre des deux propositions ne te conviennent, affiche ton code pour plus de détail et donne une description des composants utilisés.

    Bonne chance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Non, j'utilise un composant BDE pour la connexion (composant Database), que je lie à ma source ODBC.
    De plus, voici le code qui ouvre la connexion à ma base de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Ouverture des connexions
      try
        DMConnexionBD.Database.Open;
      except
        on EDBEngineError do
        begin
          MessageDlg('Impossible de se connecter à la base de données.'+#13+#10+'Vérifiez que vous êtes bien connecté au serveur.', mtError, [mbOK], 0);
          echecConnexion:=true;
          exit;
        end;
      end;
    DMConnexionBD est un datamodule sur lequel j'ai placé mon composant database.
    Je me suis renseigné sur la commande raise comme tu le proposais mais apparemment, cela sert uniquement à transférer l'erreur vers une autre partie du programme (d'après ce que j'ai compris en tous cas!). Comment pourrais-je alors l'utiliser pour savoir si le service SQL Server est prêt?
    De même, je ne vois pas du tout comment utiliser les socket pour résoudre ce problème (je suis débutant en programmation). Par contre, après plusieurs recherches, je suis tombé sur un article qui parlait des routines pour par exemple savoir si un programme était instancié 2 fois. Est-ce q'il y aurait un moyen d'interroger le service SQL Server de cette manière?

    Merci

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    ce que je sais c'est que tout est dans la base de Registre. J'irais voir ça pour toi, je crois que c'est la bonne piste !
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup. J'ai tenté d'utiliser la base de registre mais à vrai dire, je ne sais pas trop comment la manipuler. On peut consulter si une clé est présente dans le registre mais comment savoir si cette clé est "démarrée" ?

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Ce que je ferais moi c'est définir une clé type bool, l'initialiser avec False, au démarrage je la teste si elle vaut False alors le service vien de démarrer, je lui affecte un true et le tour est joué.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    A ta place je ferais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function IsSQLServerRunning (aDatabase: TDatabase) : Boolean;
    begin
         try
          aDatabase.Open;
          result := True;
       except
          Result := False;
       end;
    end;
    Et surtout n'oublie pas de bien renseigner les paramètres du Database car tu peux avoir un resultat à false alors que le serveur est bien en marche.
    Sinon, pourquoi passer encore par ODBC alors que tu as les compos ADO ou dbGO pour attaquer directement SQL Server.

    A+
    On progresse .....

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Fabien85 Voir le message
    Mon application démarre automatiquement au démarrage de Windows et elle doit afficher des messages en fonction de données qu'elle récupère dans la base de données (des rappels pour des dates de RDV). Cependant, au démarrage de l'ordinateur, l'application s'initialise avant que le service SQL Server ait eu le temps de démarrer, ce qui provoque donc une erreur de connexion. Il me faudrais un moyen de savoir si la connexion avec le serveur à distance est prête avant d'initialiser mon application.
    Je ne vois pas ce qui te pose problème :
    Tu essaie de te connecter au serveur. Si tu obtiens une erreur à la connexion (que tu vas capturer avec un try...except comme tu le fait), tu attends un peu pour que le service SQL démarre, et tu recommences la tentative de connexion... Ou encore, tu paramètres le ConnectionTimeOut à une valeur suffisante pour que ton appli attende que le service SQL finisse de démarrer.

    Sinon pour répondre à ta question quand même, si tu veux savoir si un service windows est démarré (et le service SQL est un service comme un autre), il faut passer par le SCM (Service Control Manager). Avec ce dernier, tu peux tester l'état d'un service, voir même le démarrer s'il ne l'est pas (attention aux droits d'accès si tu n'es pas administrateur de la machine...).
    Ton problème deviendra alors : Quel est le nom du service SQL ?
    Tu as des exemples d'utilisation du SCM dans la FAQ Delphi.

    Telle que tu présentes ton appli, elle ressemble fort à un service windows qui peut interragir avec l'utilisateur connecté.
    Si tu transformais ton appli en service Windows, tu pourrais mettre SQL Server dans la liste des dépendances et ainsi faire en sorte que ton service ne sois démarré qu'une fois le service SQL démarré...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Mon problème, c'est:comment retenter la connexion au bout d'un certain temps? (avec un timer???).
    L'idéal serait sans aucun doute le ConnectionTimeOut mais il n'existe pas pour le composant TDatabase.
    Je vais essayer de me renseigner sur le SCM.
    Par contre, mon appli n'est pas un service Windows. En effet, elle intéragit avec l'utilisateur pour le prévenir sans qu'il ait à ouvrir le logiciel mais elle sert aussi à effectuer d'autres tâches (calcul de CA, agenda, ...)

    Merci pour les renseignements

  10. #10
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Fabien85 Voir le message
    Mon problème, c'est:comment retenter la connexion au bout d'un certain temps? (avec un timer???).
    Avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    repeat
      try
        DMConnexionBD.Database.Open;
      except
        on EDBEngineError do
        begin
          sleep(30000); // On attend 30s
        end;
      end;
    until DMConnexionBD.Database.Connected;
    Bon il vaudrait peut-être mieux compter également le nombre de tentatives et s'arrêter au bout d'un moment, mais tu as le principe.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup. C'est exactement ce qu'il me fallait. J'ai rajouté une variable nTentative qui s'incrémente à chaque échec pour limiter le nombre de tentatives à 5. Voici le code:

    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
    //Ouverture des connexions
      nTentative:=1;
      repeat
        try
          DMConnexionBD.Database.Open;
        except
          on EDBEngineError do
          begin
            //Si le service SQL Server n'est pas encore prêt ou que la connexion au
            //serveur n'est pas encore initialisée alors on attend 30 secondes et on
            //rééssaye (on essaye 5 fois)
            Inc(nTentative);
            Sleep(30000);
          end;
        end;
      until (DMConnexionBD.Database.Connected=true)or(nTentative=5);
      if DMConnexionBD.Database.Connected=false then
      begin
        MessageDlg('Impossible de se connecter à la base de données.'+#13+#10+'Vérifiez que vous êtes bien connecté au serveur.', mtError, [mbOK], 0);
        echecConnexion:=true;
        exit;
      end;
    Merci encore!

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 735
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Si tu transformais ton appli en service Windows, tu pourrais mettre SQL Server dans la liste des dépendances et ainsi faire en sorte que ton service ne sois démarré qu'une fois le service SQL démarré...
    je suis assez d'accord avec ça : ça ressemble beaucoup a un service.

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

Discussions similaires

  1. Problème compte de domaine pour les services sql server
    Par philwood dans le forum Administration
    Réponses: 15
    Dernier message: 16/03/2012, 16h36
  2. Problème d'Installation Analysis service (sql server 2000)
    Par foufar2009 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/11/2010, 23h28
  3. lancement du service sql server
    Par lilia dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 08/11/2005, 16h16
  4. Problème d'import avec l'interface sql server
    Par moutanakid dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/08/2004, 16h00
  5. Comment se connecter à une base SQL server
    Par zapia dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 22/10/2003, 17h39

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