J'ai un logiciel qui fait du traitement sur un serveur SQL.
Un des traitement fait appel à une Procédure Stockée sur un serveur SQL (7, 2000 ou 2005). Le problème est que la durée d'exécution du la store proc varie de 10 sec à 2h mais je n'en ai aucune idée.
Tant que la store proc roule sur le serveur, mon logiciel est "gelé" en attente d''une réponse du serveur.
Y a-t'il moyen d'appeller la store proc et de libérer l'application pour que je fasse défiller une progress bar ou qqc du genre et de vérifier lorsque la store proc fini de s'exécuter pour reprendre le reste de mon code?
Pour résoudre ce problème on va créer plusieurs threads (environnment d'execution du programme) :
- Un qui va gérer l'affichage graphique
- Un qui va executer la requete et attendre le résultat.
Pendant que stored procedure sera executée, le thread de la requete sera gelé mais pas le thread d'affichage graphique.
Pour faire cela tu va devoir créer une variable avec le thread et qui utilisera une méthode à executer que tu lui donnera. Exemple :
Dim WithEvents t AsNew Threading.Thread(AdressOf ExecuterProcedure)Sub ExecuterProcedure()' ICI TU MET TON CODE POUR EXECUTER LA PROCEDURE. EndSUbPublicSub DemarrerProcedure()
t.start()EndSub
Et voilà.... Et pour gérer la fin de la procedure, tu ajoute une méthode qui gére l'évenement de fin du thread (si tu ne sais pas comment faire demande).
PS : Je ne connais pas SQLDMO, mais peut etre existe il une fonction ASYNC qui execute la fonction de manière asynchrone.
__________________________
Prière de ne pas oublier le magnifique tag (résolu) si votre sujet l'est !
j'ai essayer qqc avec le threading mais ca na pas trop fonctionner.... le code s'exécute mais l'application gèle toujours.... voici ce que j'ai.
Dim _Thread As New Threading.Thread(AddressOf ThreadStore)
_Thread.Name = "Call Store"
_Thread.IsBackground = True
_Thread.ApartmentState = Threading.ApartmentState.STA
_Thread.Start()
pb4.Show()
While (_Thread.IsAlive = True)
Application.DoEvents()
End While
pb4.Close()
pb4 est un petit form qui fait défiler une progressbar à l'aide d'un timer.
Voici la procedure threadstore :
Private Sub ThreadStore()
AddLigne("Compression du Log en cours...Cette opération peut prendre plusieurs minutes")
If (CallStoreProc(Login, PathLocal & "DATA\", "RIEN", LNom.Text) = False) Then
ListLog.Items.RemoveAt(ListLog.Items.Count - 1)
AddLigne("Compression du Log en cours...Échoué")
Else
ListLog.Items.RemoveAt(ListLog.Items.Count - 1)
AddLigne("Compression du Log en cours...Terminé")
End If
End Sub
Et voici CallStoreProc :
Private Function CallStoreProc(ByVal VarSystem As String, ByVal VarPath As String, ByVal VarNomBck As String, ByVal VarNomBnq As String) As Boolean
Dim req As String
req = "EXEC master..SP_Restore_BD_Client " & VarSystem & ", '" & VarPath & "', '" & VarNomBck & "', " & VarNomBnq & ", 0"
SQLS.ExecuteImmediate(req, SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_ContinueOnError)
CallStoreProc = True
End Function
This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.
En gros cette méthode va être enlevée, évite de l'utiliser.
Mais bon ça ne dit pas quelle autre méthode il faut utiliser
En cherchant un peu j'ai trouvé que :
The new SMO object model and the Microsoft Windows Management Instrumentation (WMI) APIs replace SQL-DMO. Where possible, SMO incorporates similar objects as SQL-DMO for ease of use. You can still use SQL Server 2005 with SQL-DMO, but SQL-DMO will not be updated to manage features that are specific to SQL Server 2005.
En gros SQL DMO est maintenant obsolète....
Que veux tu faire ? Continuer à utiliser cette librairie (et que je trouve la solution adaptée) ? Ou que je te fasse un code pour un autre système ?
__________________________
Prière de ne pas oublier le magnifique tag (résolu) si votre sujet l'est !
' Table object used in iteration over Tables collection.
Dim oJob As New SQLDMO.Job
Dim oJobStep As SQLDMO.JobStep
oJob.Name = "StoreProc"
SQLS.JobServer.Jobs.Add oJob
' Alter the job, adding job steps and setting starting step.
oJob.BeginAlter
oJobStep = New SQLDMO.JobStep
oJobStep.Name = "ExecutionStoreProc"
oJobStep.StepID = 0
oJobStep.DatabaseName = "mettre database name ici"
oJobStep.Command = "mettre commande ici"
oJobStep.OnFailAction = SQLDMOJobStepAction_QuitWithFailure
oJobStep.OnSuccessAction = SQLDMOJobStepAction_QuitWithSuccess
oJob.JobSteps.Add oJobStep
oJob.StartStepID = 0
' Alter the job.
oJob.DoAlter
J'ai modifié le code pour toi
Malheuresement je ne peux pas tester, j'ai peté mon ordi et l'ordi ou je suis n'a pas de compilateur .NET .......
__________________________
Prière de ne pas oublier le magnifique tag (résolu) si votre sujet l'est !
Oui c'est vrai alaa, j'avais oublié ça, c'est le multithreading en plus simple
__________________________
Prière de ne pas oublier le magnifique tag (résolu) si votre sujet l'est !