[OCILIB] Multithread et gestion des erreurs
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:
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:
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:
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:
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?