Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Outils > XMLRAD
XMLRAD Environnement de développement Web XML/XSL. Avant de poster -> F.A.Q XMLRAD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/08/2004, 17h27   #1
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
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 :
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 :
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 :
1
2
SELECT authors.au_id, 
 FROM authors authors
Recompliez et a present testez depuis le navigateur:
Code :
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
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2004, 16h41   #2
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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 !
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2004, 09h00   #3
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
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
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2004, 13h21   #4
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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 !
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2004, 14h54   #5
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
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
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2004, 10h21   #6
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
Je ne voudrais pas paraître pessimiste, mais j'ai toujours le même probleme!

J'ai rajouter ca dans mon test-case:
Code :
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
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2004, 13h51   #7
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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 !
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2004, 14h48   #8
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
Voilà une bonne nouvelle

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

Code :
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
Citation:
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
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2004, 15h57   #9
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
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 :
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;
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2004, 16h40   #10
Membre confirmé
 
Avatar de Jeweller
 
Inscription : août 2003
Messages : 354
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 354
Points : 226
Points : 226
NICKEL

Ca fonctionne super! 8)

Merci beaucoup!
Michael
Jeweller est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h21.


 
 
 
 
Partenaires

Hébergement Web