Bonjour,
J'ai une application VB6, tournant sur mon serveur, qui doit être de disponibilité maximale, mais qui exécute parfois certaines requètes longues.
Ces requêtes (UPDATE...SET) ne sont pas urgentes, donc j'ai pensé à les exécuter avec l'option adAsyncExecute afin que la main soit rendue à l'application VB immédiatement et laisser SQL Server se débrouiller avec.
Or je constate:
- que je ne peux pas en lancer plusieurs de suite sur la même connexion
- que je ne peux fermer la connexion de suite
Dans ces deux cas j'obtiens l'erreur 3711 "Operation cannot be performed while executing asynchronously."
Je peux mettre une boucle de DoEvents derrière en attendant la fin de la requète mais je trouve ça lourd. Vu le nb potentiel de requêtes lancées, je risque de me retrouver avec une imbrication de DoEvents conséquente et VB ne va pas aimer.
Une autre solution consiste à ne pas fermer la connexion, en se disant que l'objet se détruira bien tout seul en mémoire lorsque la requête sera terminée, mais on m'a appris que ce n'était pas du tout une bonne pratique en raison de fuites de mémoire potentielles.
Donc:
- existe-il mieux à faire ?
- ou y a t-il une fonctionnalité dans SQL Server pour parvenir au même résultat ?
Pour info voici une exemple de la procédure actuelle:
Merci!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Sub AsyncUpdate() Dim tmpconn As New ADODB.Connection tmpconn.Open "Provider=SQLNCLI;Integrated Security=SSPI;Database=MyBaseSQL;DataTypeCompatibility=80;Server=(local)" tmpconn.Execute "UPDATE MaTable SET MonChamp=0 WHERE MonCritère=1" , , adAsyncExecute Or adExecuteNoRecords Or adCmdText ' ici on ne mets pas le tmpconn.Close End Sub
Partager