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 17/03/2006, 16h47   #1
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 771
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 771
Points : 790
Points : 790
Par défaut [10g1][OCI]Renseigner une OCIString...

Bonjour à tous ,

J'imaginais naïvement que cette manipulation serait relativement simple. Hélas, j'ai beau chercher, je bloque.
Le code ci-dessous est une copie du code de "démo" d'Oracle. Comme souvent, ce code ne compile pas, j'ai donc adapté un peu l'appel. A présent, il compile, mais il ne marche pas.

Voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
  OCIString     *vstring1 = (OCIString *)0;
  char          c_string[20];
  sword        STATUS;
 
  strcpy(c_string, "hello world");
  ub4 lg = strlen(c_string);
  /* Assign a text string to an OCIString */
  STATUS = OCIStringAssignText( m_pEnv, m_pErr, (text*) c_string, lg, &vstring1);
  /* Memory for vstring1 is allocated as part of string assignment */
  text* ptr = OCIStringPtr( m_pEnv, vstring1 );
Après cette dernière ligne, ptr == NULL, ce qui n'est évidemment pas ce que j'attends.

Quelqu'un peut-il éclairer ma lanterne ??????
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2006, 23h59   #2
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Par défaut Re: [10g1][OCI]Renseigner une OCIString...

Citation:
Envoyé par Herode
Ce code ne compile pas
Les .lc devraient compiler avec l'instruction suivante, juste testee sous 10gR2
Code :
make -f demo_proc.mk build EXE=<file>.lc OBJS=<file>.o
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 09h03   #3
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 771
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 771
Points : 790
Points : 790
J'ai récupéré le bout de code directement dans la doc en ligne d'Oracle. Pas de .lc donc. D'ailleurs, la doc en ligne parle de fichier .c de démo qui n'existent sous aucune des installs que j'ai (en 9 et 10).

Cela dit, j'ai beau continuer à retourner le problème dans tous les sens, je ne vois pas d'où me vient ce pointeur NULL...
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 09h06   #4
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Les Pro*C d'exemples ne sont pas sur le(s) CD(s) de base, ils sont presents sur le CD "compagnon".
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 16h24   #5
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Dans votre exemple, vous ne testez pas la valeur de la variable status: pourquoi ? En C, il faut tester tous les codes retours de toutes les fonctions (OCI et les autres) car il n'y a pas de mécanisme standard d'exception. Que vaut status à l'exécution ?

Etes-vous également sûr que m_pEnv a une valeur correcte (avez-vous testé le code retour de la fonction qui a initialisé m_pEnv ) ?

A mon avis, OCI est l'interface la plus puissante d'Oracle mais aussi la plus compliquée. A moins d'en avoir absolument besoin, il vaut mieux utiliser Pro*C si on doit faire du C ou JDBC si on peut faire du java.
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 19h22   #6
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 771
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 771
Points : 790
Points : 790
Bonjour, et merci à tous deux pour vos réponses. On se sent moins seul, parce que pour ne rien vous cacher, ça fait trois semaines que je me bats pour adapter le code, et j'en chie !


Pour le test de la valeur de retour, je ne me souviens plus, je vérifierai lundi. Le pointeur sur OCIEnv est valide par contre, je l'utilise pour des traitements ultérieurs (dont le OCIStmtExecute, qui fonctionne fort bien quand je n'essaye pas de lier des tableaux de char* comme indiqué dans mon autre post désespéré ici : http://www.developpez.net/forums/viewtopic.php?t=473224

Quant à la pertinence de l'utilisation d'OCI, je n'en suis pas juge ni décisionnaire. En tant que mercenaire codeur, je fais là où on me dit de faire. Cela dit, c'est dur, mais instructif. Si j'en sors vivant, ça fera toujours bien sur le CV. 8)
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2006, 00h21   #7
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Mon C est un peu rouille. Au cas ou ca puisse aider:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
OCIString    *vstring1 = (OCIString *)0;
char         c_string[20];
sword        STATUS;
ub4          lg;
text         *ptr;
 
...
 
strcpy(c_string, "world");
lg = strlen(c_string);
/* Assign a text string to an OCIString */
STATUS = OCIStringAssignText( envhp, errhp, (text*) c_string, lg, &vstring1);
ptr = OCIStringPtr( envhp, vstring1 );  
printf("Hello %s\n",ptr);
=>
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2006, 09h48   #8
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 771
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 771
Points : 790
Points : 790
Well, ça va mieux ! L'observation sur le test de la valeur de retour était la clé. J'avais négligé de le faire, ce qui m'aurait épargné quelques migraines. Résultat : l'environnement n'était pas initialisé en mode OCI_OBJECT, ce pour quoi il refusait de travailler avec une OCIString.

Même saturé et en fin de semaine, jaurais du penser à tester status et à relever les messages Oracle.

Merci pour votre aide en tous cas. Ca va me permettre de contourner (mais pas de comprendre, hélass...) l'autre problème sur lequel je me casse les dents depuis jeudi : le liage d'un tableau de char* par OCIBindArray. Le liage d'un tableau d'OCIString fonctionne bien, heureusement, ce qui me permettra de parvenir au résultat souhaité sans perte (apparente) de perfs.
Herode 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 14h34.


 
 
 
 
Partenaires

Hébergement Web