Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
#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!