04 septembre 2012
publié par 
Lorsqu'une application WINDEV ou un site WEBDEV se connecte à une base Oracle à l'aide de la fonction HOuvreConnexion, on peut obtenir sur certaines configurations les retours suivants du mécanisme de sécurité du WLangage :
  • ORA-12504 TNS : Le processus d'écoute n'a pas obtenu de service name dans CONNECT_DATA
  • ORA-12514: TNS : le module d'écoute (listener) n'a pas pu résoudre le SERVICE_NAME figurant dans le descripteur de connexion

En effet l'interface client de Oracle, indépendante de WINDEV ou WEBDEV, utilise un fichier de paramètres nommés tnsnames.ora lui permettant de gérer les "alias" de connexion à la base. Il n'est pas rare avec le temps que des postes utilisateurs disposent de plusieurs versions du client Oracle, et donc plusieurs version du fichier tnsnames.ora. De ce fait une application peut ne pas parvenir à se connecter, si le fichier tnsnames.ora utilisé n'est pas celui configuré pour le serveur Oracle à contacter.

Pour faciliter la connexion sur ce type de configuration, à partir de la version 17 de WINDEV/WEBDEV et de la version 10 de Oracle, une syntaxe spécifique est disponible pour HOuvreConnexion, évitant l'utilisation par le client Oracle du fichier tnsnames.ora. Cette nouvelle syntaxe est également utile si le poste ne dispose par d'un client Oracle complet, mais uniquement de "Instant access". Voici la nouvelle syntaxe :

CnxOracle est une Connexion
CnxOracle..Provider = hAccèsNatifOracle
CnxOracle..Utilisateur = "user"
CnxOracle..MotDePasse = "password"
CnxOracle..Serveur = "//NomMachineServeurOracleOuIP:NumPort/NomDuServiceEcouteOracle"
HOuvreConnexion(CnxOracle)

Sans avoir recours à cette syntaxe, la connexion aurait été faite en donnant à CnxOracle..Serveur le nom d'un alias Oracle. Cet alias, aurait été défini dans le fichier tnsname.ora, avec une syntaxe détaillant l'ensemble des paramètres Oracle. Exemple :
NomAliasOracle =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = NomMachineServeurOracleOuIP)(PORT = NumPort))
)
(CONNECT_DATA =
(SERVICE_NAME = NomDuServiceEcouteOracle)
)
)

Si sur une configuration l'utilisation du fichier tnsname.ora est imposée, mais qu'un doute persiste sur sa localisation, il est possible de repérer le fichier utilisé lors de la connexion par une application en utilisant l'utilitaire procmon, en mettant un filtre "Path" "contain" "tnsnames.ora". Par défaut le fichier est recherché dans le dossier de l'exécutable, puis dans le dossier de la couche client Oracle (donc complication dès qu'il y en a plusieurs).

A noter qu'il existe également un utilitaire avec l'accès natif Oracle qui permet de décrire les alias de connexion : WDORAINS.EXE. Il peut donc également être utilisé sur les postes sur lesquels l'application est déployée. Cette solution nécessite cependant une phase de configuration supplémentaire, la nouvelle syntaxe spécifiant d'emblée toutes les informations de connexion s'avère généralement préférable.

Pour synthétiser, la connexion se fait donc soit en donnant une chaîne de connexion complète à la propriété "..serveur", soit en donnant uniquement un nom d'alias. Avec uniquement un nom d'alias, la connexion au serveur se fait en utilisant les paramètres définis pour l'alias :
  • dans WDORAINS.EXE,
  • à défaut dans le fichier tnsname.ora du dossier de l'exécutable,
  • à défaut dans le fichier tnsname.ora du client de la base Oracle.

Liens utiles :
Attention au mode de compilation :
Une application 32 bits nécessite l'utilisation d'une couche client 32 bits pour se connecter à Oracle, et une application 64 bits nécessite l'utilisation d'une couche client 64 bits. il n'y a pas de "croisement" possible.
Les éditeurs de WINDEV et WEBDEV sont compilés en 32 bits, ils nécessitent donc un client 32 bits pour se connecter à Oracle.

< Retour