PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → [WD22] Problème de connexion SQL avec les threads
[WD22] Problème de connexion SQL avec les threads
Débuté par Adrien D., 01 juin 2018 17:00 - 3 réponses
Membre enregistré
2 messages
Posté le 01 juin 2018 - 17:00
Bonjour,

Je suis sur une application Windows en WinDev22.

J’ai un souci avec l’utilisation d’une connexion SQL (ODBC SQL Serveur) dans des threads :
Lorsque j’utilise la connexion SQL depuis le processus principal (hors thread), le résultat de SQL.NbLig est parfois incorrect.

Voici comment j’ai reproduit ce bug :
J’ai un thread qui lance une requête en boucle :
Procedure DEBUG_select()

ResSQL est un booléen
cpt_erreur est un entier = 0
nom_req est une chaîne

SQLConnecte("sourceBDD", "userBDD", "mdpBDD")

POUR i = 1 _A_ 1000
nom_req = "REQ"+DonneIdentifiant()

ResSQL = SQLExec("SELECT MA_CLE FROM MA_TABLE WHERE MA_CLE = 1", nom_req)
SI ResSQL=Vrai ALORS
SQLPremier(nom_req) // Affiche la première ligne

SI SQL.NbLig <> 0 ALORS
//Trace("["+ThreadCourant()+"] SQL.NbLig = "+SQL.NbLig)
cpt_erreur++
FIN
SINON
Trace("["+ThreadCourant()+"] Erreur SQLExec ")
FIN
SQLFerme(nom_req)
FIN

Trace("["+ThreadCourant()+"] cpt_erreur = "+cpt_erreur+" / "+1000)

SQLDéconnecte()

La table est vide, NbLig doit donc renvoyer 0.

Dans le code du projet, je lance 3 fois ce thread :
ThreadMode(threadSectionCritique)
// Fonctionne
ThreadExecute("THREAD TEST AD 1",threadCopieComplèteContexteHFSQL,DEBUG_select)
ThreadExecute("THREAD TEST AD 2",threadCopieComplèteContexteHFSQL,DEBUG_select)
ThreadExecute("THREAD TEST AD 3",threadCopieComplèteContexteHFSQL,DEBUG_select)

Aucun problème jusqu’ici, mes requêtes me renvoient toutes NbLig = 0

Mais, si je fais un SQLConnecte dans le thread principal :
ThreadMode(threadSectionCritique)
// Ne fonctionne pas
SQLConnecte("sourceBDD", "userBDD", "mdpBDD")
ThreadExecute("THREAD TEST AD 1",threadCopieComplèteContexteHFSQL,DEBUG_select)
ThreadExecute("THREAD TEST AD 2",threadCopieComplèteContexteHFSQL,DEBUG_select)
ThreadExecute("THREAD TEST AD 3",threadCopieComplèteContexteHFSQL,DEBUG_select)

Là ça ne fonctionne plus : mes requêtes ne revoient pas toutes NbLig = 0. Parfois elles renvoient 1 et parfois elles renvoient 2 !
Après avoir essayé plusieurs choses, ce que je déduis c’est que dès que j’essaie de faire une connexion SQL dans le processus principal, mes résultats sont faussés.
Cependant, je ne peux pas me permettre de faire mes requetes uniquement dans des threads.


Ce bug de SQL.NbLig est-il connu ?
Comment puis-je faire pour obtenir un résultat correct ?

Merci d'avance pour vos retours !


Voici mes tentatives de résolution infructueuses :
- Appeler SQLDéconnecte avant le lancement des threads
- Modifier l’option de lancement des threads
- Appeler un sous thread qui effectue le même traitement dans mes threads
- D’autres programmes sont susceptibles de se connecter à la base mais j’ai créé une table vide pour mes tests et aucun autre programme n’y accède

--
Adrien D.
Message modifié, 01 juin 2018 - 17:02
Posté le 02 juin 2018 - 23:22
Utilisez un Select Count(*)
Membre enregistré
2 messages
Posté le 04 juin 2018 - 11:20
michell a écrit :
> Utilisez un Select Count(*)


Bonjour,

Merci pour votre retour,

Il faudrait alors doubler absolument toutes mes requêtes, ce ne serait pas du tout optimisé !

De plus, le traitement étant fait par des threads, entre le SELECT COUNT(*) et le SELECT à parcourir, il est possible que des lignes soient insérées et le résultat serait faux !

Cela ne conviens pas...

--
Adrien D.
Posté le 04 juin 2018 - 16:53
Cela ne double la requête que si le nombre renvoyé est supérieur à 0
Mais je ne connais pas assez votre contexte.

Si vous utilisez SQLAvance pour lire vos informations est-ce que vous obtenez un résultat différent ?
Je suis aussi en SQL Serveur, j'ai construit une classe basé là dessus et ça marche bien