[OCILIB] Allocation de handle de statement
Code:
1 2 3
| OCILib: 3.9.2
Oracle client/serveur: v8.1
Système: Windows 7 / VS2010 |
A l'exécution d'un programme de test comprenant les instructions suivantes:
- 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:
Code:
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 |
Malheureusement, je ne peux changer de version, cas dans lequel le problème n'existait plus pour ce développeur.
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:
Code:
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 |
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.
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:
Code:
#if OCI_VERSION_COMPILE < OCI_9_2 || defined OCI_IMPORT_RUNTIME
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.
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!