IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces de programmation Oracle Discussion :

[OCILIB] 3.9.0 - les requetes ne passent pas


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Expert sw embarqué
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert sw embarqué

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut [OCILIB] 3.9.0 - les requetes ne passent pas
    Bonjour à tous,

    Je suis en train d'essayer de me connecter à une base de données Oracle 9.1 avec OCILIB 3.9.0 sous Visual Studio 2008. J'ai correctement déclaré la librairie dans le projet, le projet se compile sans erreur ni warning, les procédures OCI_ConnectionCreate et OCI_StatementCreate se passent correctement (j'obtient un statement qui n'est pas nul), mais quand je veux exécuter un OCI_Prepare ou un OCI_ExecuteStmt, les fonctions renvoient un false.

    Le code en question est ci-dessous:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #define OCI_CHARSET_ANSI
     
    #include "ocilib.h"
     
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    void err_handler(OCI_Error *err)
    {
    	cerr << "ERROR detected !!!" << endl;
    	cerr << "  code: ORA-" << OCI_ErrorGetOCICode(err) << endl;
    	cerr << "  msg : " << OCI_ErrorGetString(err) << endl;
    	cerr << "  sql : " << OCI_GetSql(OCI_ErrorGetStatement(err)) << endl << endl;
    }
     
    int main(int argc, char* argv[])
    {
    	string stBidon;
    	OCI_Connection *cn;
    	OCI_Statement  *st;
    	OCI_Resultset  *rs;
    	OCI_Column    *col;
    	unsigned int    nb;
    	boolean ret;
     
    	if (!OCI_Initialize(err_handler,NULL,OCI_ENV_DEFAULT))
    	{
    		cerr << " Could not intialize OCI - aborting program !" << endl;
    		return 1;
    	}
     
    	cn = OCI_ConnectionCreate("database","name","passwd",OCI_SESSION_DEFAULT);
     
    	if (cn!=NULL)
    	{
    		st = OCI_StatementCreate(cn);
     
    		ret = OCI_Prepare(st, "select * from all_tables");
    		if (ret == FALSE) cerr << "  pos : " << OCI_GetSqlErrorPos(st) << endl;
     
    		ret = OCI_Execute(st);
    		if (ret == FALSE) cerr << "  pos : " << OCI_GetSqlErrorPos(st) << endl;
     
    		rs = OCI_GetResultset(st);
     
    		OCI_ConnectionFree(cn);
    	}
     
    	OCI_Cleanup();
     
    	cout << "Execution OK !" << endl << "Press <RETURN> to exit" << endl;
    	getchar();
    	return 0;
    }

    Le résultat que j'obtient sur la console est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    ERROR detected !!!
      code: ORA-0
      msg :
      sql : select * from all_tables
     
      pos : 0
    ERROR detected !!!
      code: ORA-0
      msg : The statement must be prepared to perform this operation
      sql : select * from all_tables
     
      pos : 0
    ERROR detected !!!
      code: ORA-0
      msg : The statement must be described to perform this operation
      sql : select * from all_tables
     
    Execution OK !
    Press <RETURN> to exit
    La première erreur provient du OCI_Prepare, la deuxième du OCI_Execute, et la troisième du OCI_GetResultset. Les deux dernières sont évidentes puisque le premier a raté, mais si quelqu'un pouvait me dire pourquoi le OCI_Prepare renvoie un false, cela m'arrangerait beaucoup car je suis complètement dans la panade.

    J'ai essayé avec différentes requêtes, d'un côté sur Query reporter, et de l'autre sur le programme ci-dessus; et à chaque fois elles fonctionnent sur Query reporter et pas sur mon C++.

    Merci de votre aide,

    Henri

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    1 - j'ai éxécuté ton code sur ma machine (j'ai seulement remplacé les << par des printf) et tout fonctionne correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Execution OK !
    Press <RETURN> to exit
    Version du client utilisé, version de la base utilisée ?

    Dans ton output à toi, le premier passage dans err_hander() genère une erreur interne pas oracle, utilise OCI_ErrorGetInternalCode() et OCI_ErrorGetString() pour avoir plus d'infos
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre à l'essai
    Homme Profil pro
    Expert sw embarqué
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert sw embarqué

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Merci pour la réponse.

    Citation Envoyé par Vincent Rogier Voir le message
    Version du client utilisé, version de la base utilisée ?
    Je me suis trompé pour la base c'est du Oracle 9.2 et pas 9.1 comme je l'avais dit dans mon premier post.
    L'interrogation en suivant ce qui est proposé dans le tutoriel OCILIB donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Server major    version: 9
    Server minor    version: 2
    Server revision version: 9
    Connection      version: 900
    SQL*Plus me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Connected to:
    Oracle9i Release 9.2.0.5.0 - Production
    JServer Release 9.2.0.5.0 - Production
    Comme je l'ai dit, je me connecte avec OCILIB 3.9.0
    J'ai Oracle 9 installé sur ma machine, mais je ne suis pas sûr de la version exacte (comment peut-on déterminer cela ?). Pour info, le fichier oraclient.dll a pour numéro de révision 9.0.1.1.1 (propriétés Windows). Ma machine tourne sous Windows XP SP3.

    Citation Envoyé par Vincent Rogier Voir le message
    Dans ton output à toi, le premier passage dans err_hander() genère une erreur interne pas oracle, utilise OCI_ErrorGetInternalCode() et OCI_ErrorGetString() pour avoir plus d'infos
    Je ne comprends pas le sens du début de la phrase. Si err_handler est appelé, c'est que OCILIB ou oracle a généré une erreur. Dans ce cas-ci, vu qu'on parle de la fonction OCI_Prepare(), j'imagine que c'est bien OCILIB qui génère l'erreur. Ceci dit, ça ne m'aide pas à en trouver la source.

    OCI_ErrorGetInternalCode() me donne le même résultat que OCI_ErrorGetOCICode(), c'est-à-dire 0.

    OCI_ErrorGetString() était déjà appelé dans err_handler(), et il renvoie une string vide.

    Avec un code d'erreur nul et un message vide, en plus du fait de savoir que le code est syntaxiquement correct, je doit avouer que je ne vois plus ce que je peux faire pour essayer de pointer sur la source du problème. Est-ce que quelqu'un aurait des pistes d'investigation ?

    Merci beaucoup,

    Henri

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    quelle LIB/DLL de ocilib utilises tu ? (ociliba.x ,ocilibm.x ou ocilibw.x)
    deifnits tu un OCI_CHARSET_XXX dans ton projet ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre à l'essai
    Homme Profil pro
    Expert sw embarqué
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert sw embarqué

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    quelle LIB/DLL de ocilib utilises tu ? (ociliba.x ,ocilibm.x ou ocilibw.x)
    deifnits tu un OCI_CHARSET_XXX dans ton projet ?
    J'utilise la lib ociliba.lib/dll

    Comme indiqué dans mon premier post (ligne 1 du code C++), je spécifie:
    #define OCI_CHARSET_ANSI

    Par contre, je me demande s'il pourrait y avoir un problème d'installation incomplète de mon client oracle. J'ai bien un client oracle fonctionnel, car les outils de gestion de configuration qui utilisent le client fonctionnent sans problème, le SQL*Plus qui a été installé avec le client fonctionne parfaitement bien mais, quand j'ai voulu recompiler ocilib avec mon projet (pour tracer la source du pbm), je n'ai pas trouvé de source oci sur mon ordi, ni même de dll oci. Se pourrait-il que mon installation soit incomplète ?

    Merci,

    Henri

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    si sqlplus fonctionne, ocilib le doit aussi...

    par contre tu es sur de bien linker bien ociliba.lib ?

    si oui, le probleme doit venir de la config....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    ce que tu peux faire pour en être sur, c'est de récupérer un instant client sur le site d'oracle et specifier dans OCI_Initialize() en 2eme param le répertoire ou tu aura décompréssé l'instant client. Et pour OCI_ConnectionCreate(), pour le param db, utilise une chaine de connexion easy connnect "ip:port/service_name"
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  8. #8
    Membre à l'essai
    Homme Profil pro
    Expert sw embarqué
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert sw embarqué

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    si sqlplus fonctionne, ocilib le doit aussi...

    par contre tu es sur de bien linker bien ociliba.lib ?

    si oui, le probleme doit venir de la config....
    Oui, je ociliba.lib est bien spécifié comme librairie associé au projet, et c'est la seule que j'ai recopié dans le répertoire contenant les librairies du projet.

    Par ailleurs, j'ai essayé de copier les librairies oci (un ensemble de fichier .h dont oci.h, oci.lib et oci.dll) d'un autre pc pour les mettre sur le mien. Tout compile sans problème, mais à l'exécution, le OCI_Initialize() génère une erreur "Cannot create OCI environment", avec le OCI_ErrorGetInternalCode() qui donne 23.

    J'ai téléchargé l'instant client sur le site d'Oracle, et j'ai fait ce qui était demandé dans le dernier post. OCI_Initialize() se passe bien, mais le OCI_ConnectionCreate() crashe avec le message "ORA-12705: Cannot access NLS data files or invalid environment specified". OCI_ErrorGetInternalCode() donne 0.

    Aucune idée de ce qui ne va pas ?

    Merci beaucoup,

    Henri

  9. #9
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    si tu utilise un instant client, tu dois utiliser OCI_Initiliaze() et OCI_ConnectionCreate() de cette maniere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (!OCI_Initialize(err_handler,"le_repertoire_du_instant_client_contenant_oci.dll",OCI_ENV_DEFAULT))
        {
            cerr << " Could not intialize OCI - aborting program !" << endl;
            return 1;
        }
     
        cn = OCI_ConnectionCreate("ip__ou_nom_serveur_oracle:port\service_name","name","passwd",OCI_SESSION_DEFAULT);
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  10. #10
    Membre à l'essai
    Homme Profil pro
    Expert sw embarqué
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Expert sw embarqué

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    si tu utilise un instant client, tu dois utiliser OCI_Initiliaze() et OCI_ConnectionCreate() de cette maniere :
    <snip>
    C'est bien ce que j'aavais fait. Et cela donnait l'erreur citée précédemment.

    Entretemps, j'ai demandé à mon service informatique de me désinstaller le client Oracle, et de m'installer la version 10.2 avec l'API OCI, et depuis le programme fonctionne sans problème.

    Encore merci pour toute ton aide, Vincent.

    Henri

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FPDF] Les accents ne passent pas avec FPDF
    Par beegees dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 02/03/2009, 09h16
  2. [PDO] Base de données en Unicode mais les accents ne passent pas
    Par seïna dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 30/12/2008, 16h04
  3. [SQL-Server] Les accents ne passent pas entre MS SQL et PHP ?
    Par stephane9422 dans le forum PHP & Base de données
    Réponses: 34
    Dernier message: 17/11/2008, 15h22
  4. les variables ne passent pas
    Par samiweb dans le forum Langage
    Réponses: 4
    Dernier message: 25/05/2007, 13h30
  5. [EasyPHP] Les variables ne passent pas sur EasyPHP
    Par b6i6o6 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 10/02/2006, 12h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo