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 :

[C++]quelle API ? [Fait]


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut [C++]quelle API ?
    Bonjour, dans le cadre d'un projet (c++) je dois me connecter a une BD oracle 9i locale, mais j'avoue que je suis perdu, je ne sais pas comment je vais faire.
    Pouvez vous m'indiquer une API simple a utiliser?
    Merci d'avance.

  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
    bonjour,

    En C++, tu as OCCI qui est relativement simple et PRO*C/C++

    Sinon, la plus simple est OCILIB qui est une API C et utilisable en C++.(Tuto sur OCILIB ici)
    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 éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    super tuto vicenzo merci beaucoup.

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    Bon j'ai telecharger ocilib mais je suis coincé, j'ai pas su comment configurer visual c++ 6 pour que je puisse l'utiliser. Le tuto n'est pas clair sur ce point.
    Quelqu'un sait comment faire ?
    Merci.

  5. #5
    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
    quelles sont les erreurs ?

    Extrait du tuto

    Sous Windows, pour utiliser OCILIB en ANSI, en utilisant les Dlls fournies, il suffit de créer un nouveau projet et :
    • Inclure "ocilib.h"
    • Définir OCI_API=__sdtcall dans les options du préprocesseur du projet
    • Si toutes les variantes ocilib[x].lib sont disponibles pour le linker, il faut alors préciser quel version en insérant #pragma comment(lib, "ocilib[x].lib") dans un des fichiers du projet
    Pour résumer :
    • Tu places ocilib.h dans un répertoire d'includes connu de VC ou tu ajoutes le répertoire src d'ocilib au répertoire d'include sde VC
    • Tu ajoutes #pragma comment(lib, ociliba.lib) au source principal de ton appli
    • Tu inclus ocilib.h dans ton appli
    • tu ajoutes OCI_API=__sdtcall dans les options du préprocesseur du 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

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    Ben j'ai mis ocilib. dans le dossier du projet, ainsi que les .dll et .lib et j'ai testé avec le code 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
    21
    22
    23
    #include <iostream>
    using namespace std;
     
    #define OCI_API __stdcall 
    #define OCI_IMPORT_RUNTIME
    #define OCI_CHARSET_ANSI 
    #pragma comment(lib, ociliba.lib)
    #include "ocilib.h"
     
     
    int main()
    {
    	if (OCI_Initialize(NULL, NULL,NULL) == FALSE)
        	return EXIT_FAILURE;
     
        /* ... code application ... */
     
        OCI_Cleanup();
     
     
     
    	return 0;
    }
    les erreus:
    main.obj : error LNK2001: unresolved external symbol _OCI_Cleanup@0
    main.obj : error LNK2001: unresolved external symbol _OCI_Initialize@12

  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
    Place plutôt la définition de OCI_API et OCI_IMPORT_RUNTIME dans les options du préprocesseur
    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
    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
    Bon,

    J'ai pris VC6 et fais un petit test. J'ai
    • crée un nouveau projet
    • crée un fichier main.c (code ci après)
    • ajouté dans les options du projet, onglet C/C++, , champ preprocessor definitions : OCI_API=__stdcall,OCI_IMPORT_RUNTIME
    • ajouté le répertoire src du package ocilib dans les options de VC, onglet directories, item répertoire d'includes
    • ajouté le repertoire lib du package ocilib dans les options de VC, onglet directories, item répertoire de librairies
    • et tout compile correctement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "ocilib.h"
     
    #pragma comment(lib, "ociliba.lib")
     
    int main()
    {
        OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
        OCI_Cleanup();
        return 0;
    }
    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

  9. #9
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    j'ai trouvé ! j'ai fait un clic droit sur le projet +clean (pour eliminer les fichiers intermediaires) et j'ai modifier le #pragma
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma comment(lib,"ociliba.lib")
    Au fait ça sert a quoi un #pragma ?

  10. #10
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    Bon j'ai un autre probleme maintenant , je ne suis pas arrivé a me connecter a la BD malgré plusieurs tentatives.
    voila le code:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    int main()
    {
    	OCI_Initialize(NULL, NULL,OCI_ENV_DEFAULT) ;
    	if (OCI_Initialize(NULL, NULL,NULL) == false)
        	return EXIT_FAILURE;
     
     
        OCI_Connection *cn=NULL;
     
     
        cout<<"here"<<endl;
        cn = OCI_CreateConnection("home", "moi","motedepasse",OCI_SESSION_DEFAULT);
    	if (cn!=NULL)
    	{
    		cout<<"ok"<<endl;
    	}
    	else
    	{
    		cout<<"echec conection "<<endl;
    	}
    	OCI_FreeConnection(cn);
     
        OCI_Cleanup();
     
     
     
    	return 0;
    }
    Je sûr de mont mdp , nom utilisateur et le nom de la BD.
    Que faire ?

  11. #11
    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
    quel est ton client oracle ?
    quel est le contenu de ton tnsname.ora ?
    Utilises tu un instant client ?
    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

  12. #12
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    J'utilise oracle 9i et la BD est locale.
    Voila le contenu de mon tnsname.ora:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # TNSNAMES.ORA Network Configuration File: F:\oracle\ora90\network\admin\tnsnames.ora
    # Generated by Oracle configuration tools.
     
    HOME =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = louwled)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = home)
        )
      )
     
    INST1_HTTP =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = louwled)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVER = SHARED)
          (SERVICE_NAME = MODOSE)
          (PRESENTATION = http://HRService)
        )
      )
     
    EXTPROC_CONNECTION_DATA =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
        )
        (CONNECT_DATA =
          (SID = PLSExtProc)
          (PRESENTATION = RO)
        )
      )
    C'est quoi un instant client ?

  13. #13
    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
    Pour savoir la cause de l'erreur, ajoute un error handler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void errorHandler(OCI_Error *err)
    {
        cout << "ERROR : " << OCI_ErrorGetString(err) << endl;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       if (OCI_Initialize(errorHandler, NULL, OCI_ENV_DEFAULT) == FALSE)
            return EXIT_FAILURE;
    OCI_Initialize() ne doit être appelée qu'une seule fois
    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

  14. #14
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR : ORA-12154: TNS : l'identificateur de connexion indiqué n'a pas pu etre résolu

  15. #15
    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
    Et avec sqlplus avec les mêmes paramètres, ça marche ?

    Peux tu poster le contenu de ton sqlnet.ora ?
    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

  16. #16
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    J'ai trouvé comment faire, j'ai suivi la solution de ce post

    J'ai remarqué une erreur dans ton tuto:
    OCI_Connection *cn;
    OCI_Statement *st;

    /* ... */

    st = OCI_CreateStatement(cn);

    OCI_ExecuteStmt(st, "delete from my_table where code is null");

    printf("%d row deleted", OCI_GetAffectedRows(st));

    OCI_FreeStatement(st);

    /* ... */
    J'ai réussi a insérer une ligne dans la base mais lorsque je consulte la base je constate que les modifications n'ont pas été enregistré.
    Que faire ?

  17. #17
    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
    Il faut valider tes modifs par OCI_Commit()

    tu peux aussi passer en mode auto-commit avec OCI_SetAutoCommit()

    PS : merci pour la coquille dans le tuto....je vais corriger ca.

    PS : penses à marquer le topic comme résolu !
    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

  18. #18
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    Merci pour ton aide .

  19. #19
    bruce-willis
    Invité(e)
    Par défaut
    [c++]quelle API ?
    ADO, DAO en font-ils partie ? ADO est-il une API ou quoi ?

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

Discussions similaires

  1. [Info] Quelle API graphique pour une "carte habitée"
    Par loz dans le forum SIG : Système d'information Géographique
    Réponses: 16
    Dernier message: 07/11/2008, 00h15
  2. Quelle API pour detecter un Exe qui s'execute.
    Par caviar dans le forum MFC
    Réponses: 3
    Dernier message: 20/04/2006, 13h26
  3. [J2EE] quelle API pour Excel choisir ?
    Par vallica dans le forum Documents
    Réponses: 4
    Dernier message: 19/04/2006, 14h24
  4. [Cryptographie] Quelle api utiliser ?
    Par loupblanc dans le forum Sécurité
    Réponses: 2
    Dernier message: 03/02/2006, 15h52
  5. Petit moteur 2D, quelle API?
    Par SuperCed dans le forum OpenGL
    Réponses: 5
    Dernier message: 11/04/2005, 19h56

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