|
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 ... |
| |
| |
| | | |
|
| | | | |
| | |
|