PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Tuer une requete SQL Server (Thread, Spid et autre)
Tuer une requete SQL Server (Thread, Spid et autre)
Started by damien.lep, Apr., 12 2006 5:39 PM - No answer
Posted on April, 12 2006 - 5:39 PM
Bonjour.


J'utilise WD 10 avec un acces OLE DB à une base SQL SERVER 2000 SP3.
Sur clic d'un bouton, je desire lancer une fenetre contenant une table.
Sur initialisation de cette fenetre, une requete SQL est lancée via une
commande du type :

HexecuteRequeteSQL(Req,"Connexion",hRequeteSansCorrection,"exec ProcSQL "+iRef)

où ProcSQL est une procedure SQL du type :

CREATE Procedure ProcSQL (@iRef Int)
As
SELECT * FROM MATABLE WHERE Ref=@iRef

Cette requete remplira la table WD via un construittablefichier.



Mon soucis est que cette requete peut etre tres longue (moultes inner joins!),
je voudrai donc laisser la possibilite a l utilisateur de fermer la fenetre et de pouvoir
reutiliser le programme.

J'ai vu plusieurs idées, aucune ne semble marcher :
- déjà il faut laisser la main a l utilisateur. J utilise donc un thread pour initialiser
la requete. Ce thread contient donc, entre autres :

HexecuteRequeteSQL(Req,.....)
HlitPremier(Req,hSansRaffraichir)

Malheureusement une erreur arrive sur le HlitPremier : il ne trouve pas Req, qui est
pourtant une variable globale a la fenetre ! Curieusement il ne fait pas d erreur sur
hexecute! C'est comme si dans le thread il ne pouvat acceder a ma source de donnée
une fois initialisée!

-supposons que l element precedent marche...
Ma bonne vieille requete est tres longue a executer.
Si je fais un simple threadarrete("monthread"), le temps de reponse est trop long...
En fait il n arrete pas le thread du tout!
J'ai donc penser a utiliser le SPID sous SQL Server, qui est le numéro de procedure.

-Via le SPID :
Grace à l analyseur de requete et l entreprise ménager, je peux retrouver le spid
de ma procedure. Si j execute un kill numéroSpid, ma procedure SQL s arrete.
WinDev quitte donc le hexecute et "bute" normalement sur le hlitpremier
(ce coup si Req n est vraiment pas initialisé!)-> c est tout bon !
Il faut donc que je retrouve le numéro de SPID par programmation.
J ai donc penser a enregistrer le SPID dans une table que je sais retrouver !
Dans ma proc SQL je fais donc un | Update Table set Spid=@@SPID,
qui sera suivi du SELECT .... Ca donne ca :

CREATE Procedure ProcSQL (@iRef Int)
As
UPDATE TableDeSpid SET NSpid=@@SPID WHERE Ref=@iRef
SELECT * FROM MATABLE WHERE Ref=@iRef

Quand je lance cela sous l analyseur, tout marche bien : il me rempli la table avec le
bon spid puis execute la requete.
Mais curieusement sous WinDev, ca ne marche plus : cette prodecure ne fait
pas que renvoyer un record, du coup WinDev ne semble plus intercepter le record
qui est renvoyé, Req n est pas initialisé (j ai essayé sans thread)

-- Je reviens donc à la premiere definition de ma proc.
Je la lance via WinDev (sans thread) , ca tourne. Je la kill sous l analyseur,
elle s arrete et WinDev aussi (erreur sur le hlitpremier puisque l on a" coupe" hexec).
Je relance le programme WinDev, et la il n arrive plus du tout a lancer ProcSql,
comme si elle etait "mal" restee en memoire ! je suis oblige de relancer le serveur
SQL, ce qui n est pas admissible pour le client !


EN CONCLUSION :
- Je n arrive pas a utiliser de thread avec une requete SQL Server (donc pas de
threadarrete non plus)
- Je n arrive pas a acceder au n° de SPID de la procedure SQL via cette procedure
- Je ne peux pas killer cette procedure SQL via son SPID (en supposant que je l ai),
sans generer un comportement bizarre de la base (relance du serveur SQL obligatoire)
EN QQS mots :
Je n arrive a rien

Help ;-) !
Damien.


PS :
a mon avis il faut utiliser une autre méthode que toutes celles ci ...