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.
Version imprimable
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.
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)
:D super tuto vicenzo merci beaucoup. :king:
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.
quelles sont les erreurs ?
Extrait du tuto
Pour résumer :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
- 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
Ben j'ai mis ocilib. dans le dossier du projet, ainsi que les .dll et .lib et j'ai testé avec le code suivant:
les erreus: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; }
Citation:
main.obj : error LNK2001: unresolved external symbol _OCI_Cleanup@0
main.obj : error LNK2001: unresolved external symbol _OCI_Initialize@12
Place plutôt la définition de OCI_API et OCI_IMPORT_RUNTIME dans les options du préprocesseur
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; }
:yaisse2: j'ai trouvé ! j'ai fait un clic droit sur le projet +clean (pour eliminer les fichiers intermediaires) et j'ai modifier le #pragma
Au fait ça sert a quoi un #pragma ?:aie:Code:#pragma comment(lib,"ociliba.lib")
Bon j'ai un autre probleme maintenant , je ne suis pas arrivé a me connecter a la BD malgré plusieurs tentatives.
voila le code:
Je sûr de mont mdp , nom utilisateur et le nom de la BD.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; }
Que faire ?
quel est ton client oracle ?
quel est le contenu de ton tnsname.ora ?
Utilises tu un instant client ?
J'utilise oracle 9i et la BD est locale.
Voila le contenu de mon tnsname.ora:C'est quoi un instant client ?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) ) )
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; }
OCI_Initialize() ne doit être appelée qu'une seule foisCode:
1
2 if (OCI_Initialize(errorHandler, NULL, OCI_ENV_DEFAULT) == FALSE) return EXIT_FAILURE;
8OCode:ERROR : ORA-12154: TNS : l'identificateur de connexion indiqué n'a pas pu etre résolu
Et avec sqlplus avec les mêmes paramètres, ça marche ?
Peux tu poster le contenu de ton sqlnet.ora ?
J'ai trouvé comment faire, j'ai suivi la solution de ce post
J'ai remarqué une erreur dans ton tuto:
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é.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);
/* ... */
Que faire ?
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 !
Merci pour ton aide :king:.
ADO, DAO en font-ils partie ? ADO est-il une API ou quoi ?Citation:
[c++]quelle API ?