Bonsoir,

J'ai besoin d'un éclaircissement sur le multithread et la gestion des erreurs avec OCILIB 3.5.0.0. Le contexte:

  • Le programme gère le multithread lui-même. Il n'utilise pas les threads proposés par OCILIB.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OCI_Initialize( NULL, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT )
    Le programme gère son propre pool de connexion à la bdd. Une connexion pour chaque thread, ouverte au démarrage du thread et fermée avec son arrêt.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OCI_ConnectionCreate(parametre->OracleSid().c_str(), parametre->OracleUser().c_str(), parametre->OraclePwd().c_str(), OCI_SESSION_DEFAULT)


Plus tard, arrive le moment décisif d'une insertion. Fait important le programme ne travaille que sur des tableaux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
iNbRowsInArray = OCI_BindArrayGetSize(st);
iStmtActionRes = OCI_Execute(st);
iAffectedRows = OCI_GetAffectedRows(st);
En cas d'erreur je pensais naïvement que le code suivant fonctionnait:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
if (FALSE == iStatement) {
OCI_Error*	pErr = OCI_GetBatchError(st);
	while ( NULL != pErr )
	{
		unsigned int iRowIndex = OCI_ErrorGetRow(pErr);
		if ( 0 > iRowIndex )
			ERREUR(thread) << "Error at row : <" << OCI_ErrorGetRow(pErr) << "> : <" << OCI_ErrorGetString(pErr) << ">" << print ;
		else
			ERREUR(thread) << "Error not related to array DML: " << OCI_ErrorGetString(pErr) << print ;
 
		// Get next error
		pErr = OCI_GetBatchError(st);
         }
Dès le premier appel à OCI_GetBatchError le programme plante brutalement... J'en conclus que je ne dois pas faire quelque chose que je devrais. Probablement une initialisation... Mais à quel moment?