A l'exécution d'un programme de test comprenant les instructions suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3OCILib: 3.9.2 Oracle client/serveur: v8.1 Système: Windows 7 / VS2010
- OCI_ConnectionCreate
- OCI_StatementCreate
- OCI_Prepare
- OCI_Execute
- OCI_GetResultset
Je reçois les mêmes erreurs décrites dans ce post.
Je les recopie ici pour ceux qui feraient une recherche:
Malheureusement, je ne peux changer de version, cas dans lequel le problème n'existait plus pour ce développeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 code: ORA-0 msg : code: ORA-0 msg : The statement must be prepared TO perform this operation code: ORA-0 msg : The statement must be described TO perform this operation
En debuggant dans les sources d'ocilib, j'ai pu remarquer que dans OCI_Prepare, je ne passais pas dans cet appel d'OCI_HandleAlloc:
Ce qui est logique, puisqu'en compilant pour Windows, OCI_VERSION_COMPILE est égal à OCI_11_2. Du coup on ne teste pas la version runtime.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #if OCI_VERSION_COMPILE < OCI_9_2 if(OCILib.version_runtime < OCI_9_2) { /* allocate handle */ res = (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) stmt->con->env, (dvoid **) (void *) &stmt->stmt, (ub4) OCI_HTYPE_STMT, (size_t) 0, (dvoid **) NULL)); } #endif
De ce fait, on appelle ensuite un OCI_Execute avec un handle de statement à null.
Je ne me suis pas renseigné, mais je devine que cet appel n'est pas nécessaire pour les versions supérieures ou égales à 9.2 (d'où les if), mais dans mon cas (compilation sous Windows avec la 8.1), il faudrait.
J'ai donc modifié le #if en:
pour que sous Windows dans tous les cas on teste la version runtime, puisqu'on ne connait pas la version à la compilation. Tout semble fonctionné correctement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #if OCI_VERSION_COMPILE < OCI_9_2 || defined OCI_IMPORT_RUNTIME
Est-ce bien la bonne modification à faire sans compromettre la stabilité de la lib?
Par ailleurs, reprenant du code écrit avec les appels de fonction d'OCI, la lib OCILib est un vrai bonheur!
Partager