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.
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_Initialize( NULL, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT )
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.
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 iNbRowsInArray = OCI_BindArrayGetSize(st); iStmtActionRes = OCI_Execute(st); iAffectedRows = OCI_GetAffectedRows(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?
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); }
Partager