Lorsque vous tentez d’exécuter une requête sur un serveur distant SQL Server, vous pouvez obtenir l’erreur suivante : “Erreur 80040e31, le délai d’attente de la requête a expiré”. En fait, le serveur n’a pas répondu assez vite à la commande envoyée.
En effet, il faut bien distinguer le temps d’exécution maximum d’une requête distante (qu’on définit dans les paramètres de SQL Server) et le temps accordé avant qu’une commande envoyée n’expire. C’est pour cela qu’on ne doit pas modifier directement de paramètre sur le serveur mais bien dans la chaine de connexion à la base de données.
Avec HDécritConnexion, vous pouvez définir des informations étendues. Vous pouvez également faire de même en éditant la propriété “InfosEtendues” de la variable de type “Connexion”. La documentation vous indique quelles sont les informations optionnelles utilisables dans la chaine de connexion. Celle qui attire notre attention ici est “WD Command Timeout”, qui permet de fixer la durée maximale de l’exécution d’une commande.
Les valeurs possibles sont :
- -1 : valeur par défaut définie par la couche client (dans WinDev, il s’agit de 30 secondes – cela s’applique aussi à HyperFileSQL C/S).
- 0 : illimité. Faites bien attention car des blocages peuvent survenir.
- > 0 : temps en secondes (dans notre exemple, nous avons indiqué 600 secondes, soit 10 minutes).
En .NET (par exemple en VB ou en C#), il est également possible de définir ce timeout en le précisant dans une propriété (CommandTimeout) de la variable SqlCommand. L’exemple ci-dessous permet d’augmenter le temps jusqu’à 90 secondes avant l’expiration.
Enfin, en Java, il suffit d’appeler la fonction “setQueryTimeOut” de l’objet “Statement” qu’on aura au préalable initialisé. Dans l’exemple, on laisse un délai de 60 secondes pour envoyer la commande, avant qu’elle n’expire. Il faut impérativement utiliser cette fonction avant d’exécuter la requête.
Nous pouvons évidemment continuer à citer les différentes analogies entre les nombreux langages de programmation qui existent, mais cela risquerait de prendre beaucoup trop de temps. Ainsi, voici un billet qui pourra servir de mémo dans le futur, au cas où cela vous échapperait à nouveau.