Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2008, 12h00   #1
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
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.
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 13h02   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 15h11   #3
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
super tuto vicenzo merci beaucoup.
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h26   #4
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
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.
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h33   #5
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
quelles sont les erreurs ?

Extrait du tuto

Citation:
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h39   #6
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
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 :
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:
Citation:
main.obj : error LNK2001: unresolved external symbol _OCI_Cleanup@0
main.obj : error LNK2001: unresolved external symbol _OCI_Initialize@12
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h41   #7
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 17h55   #8
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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 :
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 18h09   #9
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
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 :
#pragma comment(lib,"ociliba.lib")
Au fait ça sert a quoi un #pragma ?
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 19h26   #10
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
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 :
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 ?
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 19h45   #11
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 20h15   #12
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
J'utilise oracle 9i et la BD est locale.
Voila le contenu de mon tnsname.ora:
Code :
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 ?
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 21h09   #13
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Pour savoir la cause de l'erreur, ajoute un error handler.

Code :
1
2
3
4
void errorHandler(OCI_Error *err)
{
    cout << "ERROR : " << OCI_ErrorGetString(err) << endl;
}
Code :
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2008, 10h40   #14
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
Code :
ERROR : ORA-12154: TNS : l'identificateur de connexion indiqué n'a pas pu etre résolu
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2008, 15h07   #15
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2008, 15h57   #16
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
J'ai trouvé comment faire, j'ai suivi la solution de ce post

J'ai remarqué une erreur dans ton tuto:
Citation:
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 ?
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2008, 17h05   #17
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2008, 20h13   #18
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
Merci pour ton aide .
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 11h54   #19
bruce-willis
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
[c++]quelle API ?
ADO, DAO en font-ils partie ? ADO est-il une API ou quoi ?
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h01.


 
 
 
 
Partenaires

Hébergement Web