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 16/06/2011, 15h24   #1
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 0
Points : 0
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++ :
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 :
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
hdelaval est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 07h26   #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
1 - j'ai éxécuté ton code sur ma machine (j'ai seulement remplacé les << par des printf) et tout fonctionne correctement :

Code :
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 11h20   #3
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 0
Points : 0
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 :
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 :
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
hdelaval est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 19h22   #4
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
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 09h44   #5
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 0
Points : 0
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
hdelaval est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 10h35   #6
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
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 10h39   #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
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 08h27   #8
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 0
Points : 0
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
hdelaval est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 09h16   #9
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
si tu utilise un instant client, tu dois utiliser OCI_Initiliaze() et OCI_ConnectionCreate() de cette maniere :
Code :
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 13h03   #10
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 0
Points : 0
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
hdelaval est déconnecté   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 19h12.


 
 
 
 
Partenaires

Hébergement Web