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

XMLRAD Discussion :

XMLCollectionEvents.BeforeDispatch


Sujet :

XMLRAD

  1. #1
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut XMLCollectionEvents.BeforeDispatch
    Hello!

    Je vous soumets ici un probleme (peut être certains diront tiré par les cheuveux, mais dont j'ai besoin d'une solution...) qui pourrait être un bug du framework... Et c'est un peu la question.

    Je vais essayé de résumé de façon simple la situation:

    Dans un évènement Delphi (par exemple XMLModule.BeforeDispatch, mais peu importe en faite), j'ai une dacquery toute simple qui va checker une donnée dans la base. (un simple select sur une table X)

    A coter, j'ai un xmlservice, avec un DBExtract qui contient une template (select champ1 from tableY where {$param} ).

    Si param est corretement renseigné, toute mon execution se déroule normalement. (Pour le test, je renseigne ma template directement depuis le navigateur... pour le test seulement )

    A présent, je place volontairement une erreur sql dans ma template param (par exemple une colonne qui n'existe pas)... Mon service en question me donne une erreur: logique. (Erreur SQL machin, invalid column name...)

    Lors du prochain appel, je rétablis mon param avec une valeur sql correct... tout devrait rentrer dans l'ordre!

    Eh bien non! Ma DacQuery placée dans mon XMLModule, refuse de se reconnecter comme si j'avais perdu la connexion à la BDD et on obtient une "défaillance irrémédiable"... Il faut iisreseter !

    En gros, dès qu'une erreur SQL apparait sur un XMLModule, celui-ci semble perdre la connexion et part complètement en carafe.

    Est ce que vous pouvez reproduire ce phénomène ? Comment faire pour ne pas déstabiliser tout le module apres une templace mal renseignée?

    Michael

    PS: voici un test-case simple sur la base de démo de SQLServer:
    Créez une nouvelle appli vers la base 'pubs'
    Créez un nouveau service qui liste simplement la table 'jobs' et ajoutez un template:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT jobs.job_id, 
      jobs.job_desc, 
      jobs.min_lvl, 
      jobs.max_lvl {$JOB}
    FROM jobs jobs
    Depuis Delphi et dans l'évènement BeforeDispatch du XMLModule, saisissez le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     DacQuery1.close;
     if not DacQuery1.prepared then DacQuery1.prepare;
     DacQuery1.open;
     DacQuery1.close;
    Posez une DacQuery et saisissez le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT authors.au_id, 
     FROM authors authors
    Recompliez et a present testez depuis le navigateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .../MyProject1.dll/listJobs?JOB=    -> Ca marche
    .../MyProject1.dll/listJobs?JOB=,MMMM    -> erreur SQL
    .../MyProject1.dll/listJobs?JOB=    -> Ca marche plus et ca devrait!
    Le module est indisponible (à cause de la requete dans le BeforeDispatch), il faut faire un iisreset

  2. #2
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    en fait tu as de la chance que ca marche dans un cas, parce que le DacQuery ne tient pas compte des templates properties, c'est seulement dans le DBExtract !

  3. #3
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    De la chance?

    Je n'utilise pas de template dans mon dacquery, et la n'est pas mon probleme. Mon probleme c'est qu'apres une erreur SQL dans le DBExtract (là où il y a le template), ma dacquery (elle, classique) ne fonctionne plus!
    Est ce que je suis dans un fonctionnement particulier ? Mais comment faire autrement alors!?

    Alors, c'est un bug?

    Michael

  4. #4
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    ah zut j'avais lu en diagonale
    non c'est pas un bug.
    Si tu es dans un XMLApplicationEvents, c'est normal, aucune XMLCollection n'est alloué pour ton gestionnaire d'événement donc pas de Database, et je réitère mon coup de chance, car en fait le DacQuery doit avori une des Databases qui doit trainer dans une des XMLCollections.
    Donc c'est à toi de récupérer une Database d'un XMLcollection et de l'assigner au DacQuery et bien sur de gérer les transactions !

  5. #5
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Si je comprends bien alors, j'ai de la chance que ma DacQuery fonctionne, c ca ?

    Mais a vrai dire, je ne comprends pas trop pkoi ca fonctionne tres bien dans tout les cas (j'ai plusieurs modules), mais une fois qu'un dbextract fait une erreur, le database du module en question par en vrille...
    Ceci dit, je vais essayer d'assigner systématiquement une database à mes DacQuery, tu me dis que ca corrigera le pb!
    Je reviendrais ici donner des nouvelles

    Michael

  6. #6
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Je ne voudrais pas paraître pessimiste, mais j'ai toujours le même probleme!

    J'ai rajouter ca dans mon test-case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     DacQuery1.Database := XMLCollection.GetDatabaseComponent('Database');
     DacQuery1.close;
     if not DacQuery1.prepared then DacQuery1.prepare;
     DacQuery1.open;
     DacQuery1.close;
    Et ca ne change rien du tout!!

    -> Défaillance irremmédiable !
    (que ce soit dans le module.beforedispatch ou l'xmlapplication.beforedispatch, et quelque soit la position de l'affectation du database)

    Y a pas de solution, c ca, hein!

    Michael

  7. #7
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    Si il y en a une, toute simple.
    je viens de reproduire le problèmeet j'ai debuggé pour comprendre ce qui se passait.
    suite a l'erreur, la gestion d'erreur du Framework deconnecte la base de données effectivement. Ce mécanisme et la au cas ou l'on a une perte de connexion.
    donc lors de la prochaine requête, lau moment de l'execution du XMLGram, le framework vérifie que la base de donéne est connecté, sinon elle ouvre la connexion.

    le problème ici c'est que c'est à toi de vérifier qu ela connexion à la base de donnée est bien effective et, le cas échéant, l'ouvrir.
    autrement tout marche parfaitement !

  8. #8
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Voilà une bonne nouvelle

    Mais pourtant je ne parviens toujours pas à resoudre mon soucis , j'ai pourtant ajouté le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not DacQuery1.Database.Connected then DacQuery1.Database.Open;
    Est ce que je m'y prends mal, c'est bien comme ca, non ?
    Sinon par quoi entends tu
    vérifier qu ela connexion à la base de donnée est bien effective et, le cas échéant, l'ouvrir ?
    Même avec cela, j'ai toujours l'erreur "TDacQuery.GetPrepared: défaillance irremmediable" qui me poursuit!

    Michael

  9. #9
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    bon d'abord tu es dans quel dispatch ? XMLApplcaitionEvent.BeforeDispatch
    ou bien XMLCollection.beforeDispatch ?

    Je te préviens tout de suite, il faut être dans XMLCollectionEvents.BeforeDispatch.

    ensuite tu as le code suivant
    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
     
    var
      Database: TDacDatabase;
    begin
      Database := (XMLCollection as IXMLCollection2).GetDatabaseComponent('Databse');
      if not Database.Connected then
        Database.Open;
      DacQuery1.Database := Database;
      if not DacQuery1.Prepred then
        DacQuery1.Prepare;
      DacQuery1.Open;
      try
      finally
        DacQuery1.Close;
      end;
    end;

  10. #10
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    NICKEL

    Ca fonctionne super! 8)

    Merci beaucoup!
    Michael

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

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