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 :

[FIREDIRD] [FIREDAC] Firedac et le Thread


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut [FIREDIRD] [FIREDAC] Firedac et le Thread
    Bonjour à tous

    Je suis en train de basculer une appli qui utilisait les composants IbDAC vers Firedac sous Delphi XE7, mais j'ai des difficultés à lancer une connexion dans un thread.

    J'ai suivi la procédure indiquée par :
    http://docwiki.embarcadero.com/RADSt...ding_(FireDAC)
    https://riptutorial.com/fr/delphi/ex...xemple-firedac

    Ainsi, le FdManager est activé avec avec la définition de connexion fournie avec FDManager.AddConnectionDef('appli', 'FB', Param);
    La définition de la connexion est privée comme cela est recommandé ( http://docwiki.embarcadero.com/RADSt...xion_(FireDAC) ) pour l'utilisation dans un Thread
    Dans Param, j'ai bien indiqué que la connexion est pooled (Pooled=True) comme indiqué dans les tutos.


    mais rien n'y fait.
    Je reçois le message :
    Le projet xxx a déclenché la classe d'exception Exception avec le message : 'Can't perform operation on inactive transaction'
    à la création de la connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Base_FireDac := TFDConnection.Create(nil);


    Pour infos, j'utilise le composant de JEDI VCL pour le thread (TJvThread) au cas où cela peut avoir une incidence.
    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 TfData.Th_Envoi_ErreurExecute(Sender: TObject; Params: Pointer);
    VAR
        Base_Firebird: TIBCConnection;
        Trans_Firebird: TIBCTransaction;
    ....
    begin
                        Base_FireDac := TFDConnection.Create(nil);
                            Base_FireDac.ConnectionDefName := 'appli';
     
    ......
     
     
    end;
    Je ne vois pas ce que j'ai manqué ? des idées ?
    merci d'avance

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    ah le message maudit qui arrive parfois sans explication.

    j'aimerais juste comprendre pourquoi tu déclares des TIBCConnection et les crée en tant que TFDConnection

  3. #3
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    Bonjour et merci pour la réponse



    j'aimerais juste comprendre pourquoi tu déclares des TIBCConnection et les crée en tant que TFDConnection
    Parce que les différents éléments dans le thread doivent être "autonome", non ? J'ai suivi l'exemple présenté par Embarcadero ci-dessous ( http://docwiki.embarcadero.com/RADSt...ding_(FireDAC) )

    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
    procedure TDBThread.Execute;
    var
      oConn: TFDConnection;
      oPrc: TFDQuery;
    begin
      FreeOnTerminate := False;
      oConn := TFDConnection.Create(nil);
      oConn.ConnectionDefName := 'Oracle_Pooled'; // see next section
      oPrc := TFDStoredProc.Create(nil);
      oPrc.Connection := oConn;
      try
        oConn.Connected := True;
        oPrc.StoredProcName := 'MY_LONG_RUNNING_PROC';
        oPrc.ExecProc;
      finally
        oPrc.Free;
        oConn.Free;
      end;
    end;
    Je déclare la connexion puis je la crée.

    Par contre, je me suis trompé dans mon exemple (j'ai déclaré des éléments de IbDac )
    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
     
    PROCEDURE TfData.Th_Envoi_ErreurExecute(Sender: TObject; Params: Pointer);
    VAR
        Base_FireDac : TFDConnection;
        Trans_FireDac: TFDTransaction;
     
    ....
    begin
                        Base_FireDac := TFDConnection.Create(nil);
                        Base_FireDac.ConnectionDefName := 'appli';
     
    ......
     
     
    end;
    Ce n'est pas correct ?

  4. #4
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    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
     
    PROCEDURE TfData.Th_Envoi_ErreurExecute(Sender: TObject; Params: Pointer);
    VAR
        Base_FireDac : TFDConnection;
        Trans_FireDac: TFDTransaction;
     
    ....
    begin
                        Base_FireDac := TFDConnection.Create(nil);
                        Base_FireDac.ConnectionDefName := 'appli';
     
    ......
     
     
    end;
    Ce n'est pas correct ?
    comme ça, si, ça devrait passer

    as-tu des transactions sur ta base ? fermes-tu les connexions quelque part une fois plus utilisées ?

  5. #5
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    Bonjour à tous

    J'ai trouvé la solution à partir de l'indication de pprem
    "fermes-tu les connexions quelque part une fois plus utilisées ? "
    Oui, il me restait une transaction ouverte avant de lancer le thread. Je l'ai fermé et maintenant cela fonctionne.


    Donc avant d’exécuter un Thread, il faut faire attention de bien avoir fermer les transactions du "principal" (je suis sûr que ce n'est pas comme cela que cela s'appelle)


    A+ et a d'autres posts

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

Discussions similaires

  1. Mise à jour de Firedac (Update 2)
    Par SergioMaster dans le forum Delphi
    Réponses: 11
    Dernier message: 02/05/2014, 22h37
  2. XE2 FireDac ODBC : message d'erreur
    Par artmicro dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/08/2013, 10h05
  3. XE4 , Firedac et datasnap
    Par SergioMaster dans le forum Bases de données
    Réponses: 8
    Dernier message: 01/06/2013, 10h40
  4. Embarcadero propose FireDAC pour l'accès aux Bdd
    Par John Colibri dans le forum Delphi
    Réponses: 0
    Dernier message: 01/03/2013, 07h56

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