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 :

Suis-je connecté à ma BD ou pas ?


Sujet :

Bases de données Delphi

  1. #1
    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 Suis-je connecté à ma BD ou pas ?
    Bonjour !

    Afin de savoir si je suis ou non connecté à ma base de données j'ai utilisé un Timer comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TfmMain.Timer1Timer(Sender: TObject);
    begin
      Timer1.Interval := 5000;
      if (DM <> nil) then
        if (DM.IBCConnection1.Connected) then RzStatusPane5.Caption := 'Etat : connecté'
        else RzStatusPane5.Caption := 'Etat : déconnecté'
    end;
    ma base de données et de type Firebird même si en terme de syntaxe ça parait juste, mais en terme d'exécution ça ne donne pas le résultat escompté.
    Afin de tester ce bout de code, j'ai déconnecté la base de données manuellement, mais l'application n'a pas réagit ?! dois-je ajouter autre chose ?

    Merci par avance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 593
    Points
    593
    Par défaut
    Vérifie la création de ton Datamodule, et de l'activation de ton timer
    <On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 451
    Points : 24 859
    Points
    24 859
    Par défaut
    Pense effectivement à mettre quelque part, comme le signale JustMe
    à la création du DM par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Timer1.Enabled := True;
    Si ton time-out de connexion est plus long que 5 secondes, le timer va se déclencher trop de fois et émettre le message WM_TIMER inutilement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TfmMain.Timer1Timer(Sender: TObject);
    begin
      Timer1.Interval := 5000;
      Timer1.Enabled := False;
      try
        if (DM <> nil) then
          if (DM.IBCConnection1.Connected) then
            RzStatusPane5.Caption := 'Etat : connecté'
          else
            RzStatusPane5.Caption := 'Etat : déconnecté';
      finally
        Timer1.Enabled := True;
      end;   
    end;
    Ensuite, est que Connected vérifie vraiment l'état de la connexion ou ne fait que lire un membre privé FConnected !
    Il faut peut-être faire une action comme par exemple lancé une requete pour forcer la détection de la perte de connection !

    As-tu pensé à utiliser plutôt TCustomDAConnection.OnConnectionLost Event
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIBCConnection = class(TCustomDAConnection);
    This event occurs when connection was lost.

    Class TCustomDAConnection

    Syntax property OnConnectionLost: TConnectionLostEvent;

    Remarks

    Write the OnConnectionLost event handler to process fatal errors and perform failover.

    Note: you should explicitly add the T:Devart.Dac.Units.MemData unit to the 'uses' list to use the OnConnectionLost event handler.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  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
    Citation Envoyé par ShaiLeTroll Voir le message

    Ensuite, est que Connected vérifie vraiment l'état de la connexion ou ne fait que lire un membre privé FConnected !
    Il faut peut-être faire une action comme par exemple lancé une requete pour forcer la détection de la perte de connection !
    [/URL]
    c'est ce que je pense car j'ai fais tout ce que vous avez suggérer mais l'étant ne change guère comme si il le lit en établissant la connexion puis il ne le remet jamais à jour !
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    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
    Re-bonjour tout le monde
    comme suggéré et puisque j'utilise les composants DEVART, j'ai fais appelle à l'événement OnConnectionLost 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
    20
    21
    22
    23
    24
    25
    26
    procedure TDM.IBCConnection1ConnectionLost(Sender: TObject;
      Component: TComponent; ConnLostCause: TConnLostCause;
      var RetryMode: TRetryMode);
    var
      Msg : string;
    begin
       case ConnLostCause of
        clUnknown:
          Msg := 'suiet à une erreur inconnue';
        clExecute:
          Msg := 'une exécution SQL';
        clOpen:
          Msg := 'l''ouverture d''une requête';
        clApply:
          Msg := 'une MAJ du cache';
        clServiceQuery:
          Msg := 'la demande d''informations de service';
        clTransStart:
          Msg := 'un démarrage de la transaction';
        clConnectionApply:
          Msg := 'une connexion au cache';
        clConnect:
          Msg := 'l''établissement de la connexion';
      end;
      ShowMessage(Component.Name + ' - Connecxion perdue durant ' + Msg);
    end;
    et puisque j'ai rien comme retour même si je déconnecte ma BD depuis le serveur où elle est hébergé je me demande si je dois faire un appel explicite à cet événement qui me semble, d'après DEVART, doit se faire d'une façon implicite ?!
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Il y a de fortes chances (n'utilisant pas Devart), que l'évènement soit déclenché lors de la prochaine requête adressée au serveur. Tant que tu ne fais rien, il considère que tu es connecté (DBExpress fonctionne sur ce principe).

    Pour tester la connexion au serveur lance une requête régulièrement sur le serveur (genre un select current_timestamp from RDB$DATABASE. Par contre, faire attention, cela bloque l'application lors de l'attente de connexion au serveur.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Comme linkin je n'utilise pas devart, mais ....

    la perte de liasion peut avoir deux causes (enfin au moins)
    1- la perte du réseau local
    2- le shutdown de la SGBD

    dans les deux cas
    Citation Envoyé par linkin
    Pour tester la connexion au serveur lance une requête régulièrement sur le serveur (genre un select current_timestamp from RDB$DATABASE. Par contre, faire attention, cela bloque l'application lors de l'attente de connexion au serveur.
    il y aura un délai , pour obtenir finalement une réponse négative

    la première cause , il vaut mieux la tester en testant l'adresse réseau (dans ce cas je conseille plutôt icp à Indy)

    la seconde , il faudrait envoyer un événement (Event Firebird) avant de fermer la base Firebird et donc gérer cet événement (via un Tibevent ou autre du même accabit)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    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
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Comme linkin je n'utilise pas devart, mais ....

    la perte de liasion peut avoir deux causes (enfin au moins)
    1- la perte du réseau local
    2- le shutdown de la SGBD
    Ok Serge, je vais explorer ces deux pistes, pour le moment voilà ce que j'ai pu faire suite à la proposition de linkin :
    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
    procedure TfmMain.Timer1Timer(Sender: TObject);
    const
      msg_sql = 'Select current_timestamp from RDB$DATABASE';
    begin
      Timer1.Interval := 2000;
      Timer1.Enabled := False;
      try
        if (DM <> nil) then
          try
            ibc_q_test_connect.SQL.Clear;
            ibc_q_test_connect.SQL.Text := msg_sql;
            ibc_q_test_connect.Active := True;
          except
            ibc_q_test_connect.Active := False;
          end;
          DM.IBCConnection1.Connected := ibc_q_test_connect.Active;
          if (DM.IBCConnection1.Connected) then
          begin
            RzStatusPane5.Font.Color := clBlack;
            RzStatusPane5.Caption := 'Etat : connecté'
          end
          else
          begin
            RzStatusPane5.Font.Color := clRed;
            RzStatusPane5.Caption := 'Etat : déconnecté';
            try
              Application.CreateForm(Tfm_msg_connexion, fm_msg_connexion);
              fm_msg_connexion.ShowModal;
              // que dois-je mettre ici afin d'essayer de me reconnecter sans quitter l'appli
            finally
              fm_msg_connexion.Free;
            end;
          end;
      finally
         Timer1.Enabled := True;
      end;
    end;
    ce qui me reste dans ce fragment de cas c'est d'essayer de me reconnecter à la bd sans quitter l'application. Mais sincèrement là je sèche
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    re,

    j'ai bien un bout de code pour la partie "perte réseau" mais hélas pas sur ce PC , dès que je l'aborde ...

    [Edit]
    Bonjour ,
    j'utilise icmp plutôt que indy , j'ai un réseau hétérogène et indy était plus lents sur les tests réseaux (voir je ne sais plus quel post à ce sujet).
    icmp.pas est récupéré dans la suite de François Piette ICS
    tout d'abord , un bout de code qui m'a servi de test, dans un timer je vérifiais la présence de mon routeur (liaison wifi)
    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
     
    uses ... icmp;
     
    procedure TForm22.Timer1Timer(Sender: TObject);
    var testIP : TICMP;
    begin
      TestIP:=TICMP.Create;
      try
        TestIP.Timeout:=1000; // defaut 1s (1000)
        TestIP.Address:='192.168.1.1';
        TestIP.Ping;
        if TestIP.ErrorCode<>0 then Showmessage('Connexion perdue '+testip.errorstring);
      finally
        TestIP.Free;
      end;
    end;
    ce petit programme ayant donné satisfaction , j'ai procédé de la manière suivante, dans un datamodule
    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
     
    uses
    ...  icmp;
     
    type
      TDataM = class(TDataModule)
     ...
     private
        { Déclarations privées }
        testIP : TICMP;
      public
        { Déclarations publiques }
        function Connecte : Boolean;
      end;
     
    var
      DataM: TDataM;
     
     
    implementation
     
    {$R *.dfm}
     
    function TDataM.Connecte: Boolean;
    begin
    Result:=TestIP.Ping=0;
    end;
     
    procedure TDataM.DataModuleCreate(Sender: TObject);
    begin
    TestIP:=TICMP.Create;
    TestIP.Timeout:=1000; // defaut 1s (1000)
    TestIP.Address:=Base.HostName;   // adresse serveur BDD
    end;
    et donc , avant de lancer une requête , il me suffit de faire :
    if DataM.Connecte then <ExecSQL>

    ce n'est pas la panacée :
    1- pas de détection du shutdown (à gérer à part)
    2- les antivirus détecte le ping et lève une alerte
    3- il y a toujours un temps de réponse (on peut diminuer le time-out)
    4- le faire dans un timer (comme dans la partie test) est no comment , réglage délicat entre déclenchement du timer et timeout

    il doit y avoir d'autres solutions en tout cas celle-ci semble plus rapide que de lancer une requête sur la BDD (je n'ai vu nulle part un moyen de changer le time out d'une requête ? enfin cela doit dépendre de la suite de composants)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Comment savoir si je suis vraiment connecté sur internet ou pas
    Par imparator_42 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/03/2009, 11h46
  2. Réponses: 1
    Dernier message: 08/11/2006, 21h14
  3. connection à chaque requête ou pas ?
    Par eschaer dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/05/2005, 13h57
  4. Connection net OK mais pas d'internet accessible. Pourquoi ?
    Par Flo. dans le forum Développement
    Réponses: 2
    Dernier message: 08/09/2003, 14h49

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