L'établissement d'une connexion à une base de données avec un connecteur natif, repose sur le client de la base fourni par son éditeur, et installé localement sur le poste qui exécute le processus (application, site, Webservice...). Si la version du client de la base installée en local n'est pas adaptée à la version de la base la base de données à laquelle l'application doit se connecter, la connexion peut échouer, ou les interrogations peuvent ne pas donner le résultat attendu.
Cela s'applique à toutes les bases qui fonctionnent sur le principe client/serveur, et donc à tous les connecteurs natifs.
C'est par exemple le cas avec SQL SERVER dans la situation suivante : - la base de données SQL SERVER est encore en version 2012, ou est en version 2019, mais avec un niveau de compatibilité paramétré sur une version antérieure (cf. clic droit sur la BDD dans SQL SERVER, "Propriétés", puis "Options" et combo "Niveau de compatibilité"),
- le poste qui va faire un HOuvreConnexion ou SQLConnecte dispose du client SQL SERVER local en version 2012 et en version 2019,
- l'application ne fait pas explicitement mention du client de la base à utiliser dans ses informations optionnelles de connexion,
- l'application est compilée en version 28.
Dans cette configuration, la connexion échoue en version 28, alors qu'elle est permise dans une version antérieure, avec la réponse : Fonction 'HOuvreConnexion', syntaxe 0 Que s'est-il passé ? Erreur de l'accès natif SQLSERVER. Numéro d'erreur = 117 SQL Server a renvoyé l'erreur 80004005 Description: Le client n'a pas pu établir la connexion SQL State: 08001 SQL Error Number: -2146893019 Sous-erreur n°1 Description: SSL Provider: La chaîne de certificats a été fournie par une autorité qui n’est pas approuvée. SQL State: 08001 Code erreur : 73001 Niveau : erreur non fatale Module : wd280hf64.dll (01F280066p - 28.0.322.0) Provider : WinDevSQLServer
La connexion échoue car le client SQL SERVER 2019 est chargé par défaut par une application compilée en version 28. Ce client n'est pas compatible avec SQL SERVER 2012 d'ou l'erreur renvoyée par SQL SERVER.
Les solutions :
- recommandée par l'éditeur de la base : mettre à jour la base SQL SERVER afin d'utiliser une version compatible avec le client local 2019,
- si la base doit rester dans cette ancienne version de SQL SERVER :
- forcer l'utilisation du client d'une version antérieure.
Il suffit pour cela d'ajouter la chaîne "WD CLIENT VERSION=2012 ;" ou "WD CLIENT VERSION=2017 ;" dans les informations optionnelles de connexion afin de sélectionner le client installé à utiliser. - ou désinstaller le client SQL SERVER 2019 afin que seul le client 2012 adapté soit trouvé par Windows lorsqu'il recherche les DLL.
De façon générale, pour tous les connecteurs natifs, il est conseillé de toujours faire exécuter l'application en production, avec la même version de client local qui a permis la validation de toutes les fonctionnalités. Pour cela il est conseillé de : - bien spécifier dans les pré-requis de l'application la version du client de la base avec laquelle elle est validée,
- utiliser si possible les informations optionnelles de la connexion pour spécifier le client à charger.
Liens utiles :
Astuce : Le code suivant permet de facilement voir pour un processus la liste des DLL chargées pour une connexion. Cela peut permettre d'ajouter une sécurité supplémentaire, si une DLL est trouvée dans une version autre que celle avec laquelle l'application a été qualifiée.
tabDLLChargées est un tableau de chaîne tabDLLNouvelles est un tableau de chaîne
POUR TOUT CHAÎNE sDLL DE ExeListeDLL(ExeDonnePID(exePID)) SÉPARÉE PAR RC tabDLLChargées.Ajoute(sDLL) FIN
CnxSQLSERVER est une Connexion CnxSQLSERVER..Provider = hAccèsNatifSQLServer CnxSQLSERVER..Utilisateur = "sa" CnxSQLSERVER..MotDePasse = "sqlserver" CnxSQLSERVER..Serveur = "srv-mon-server.com" CnxSQLSERVER..BaseDeDonnées = "" CnxSQLSERVER..Accès = hOLectureEcriture CnxSQLSERVER..InfosEtendues = "WD CLIENT VERSION=2012"
SI HOuvreConnexion(CnxSQLSERVER) ALORS POUR TOUT CHAÎNE sDLL DE ExeListeDLL(ExeDonnePID(exePID)) SÉPARÉE PAR RC SI tabDLLChargées.Cherche(tcLinéaire, sDLL) > 0 ALORS SINON tabDLLNouvelles.Ajoute(sdll) FIN FIN STOP // >> visualiser tabDLLNouvelles dans les expressions du débogueur HFermeConnexion(CnxSQLSERVER) ToastAffiche("OK") SINON Erreur("KO", ErreurInfo(errComplet)) FIN
|