J'ai un grand nombre de déclarations INSERT à exécuter. Au fur et à mesure que je les exécute, je comprends que "les curseurs ouverts maximum ont été dépassés".État du curseur invalide lors de la tentative de fermeture
OK Oracle, je vais donc fermer les curseurs immédiatement après avoir exécuté les instructions INSERT.
SQLCloseCursor(hStmt)
Mais Oracle dit à cet état "Invalid curseur."
Pourquoi Oracle n'est-il pas content que je ferme le curseur? J'ai testé ce même type de requête via un MySQL dsn et MySQL ne semble pas se plaindre de fermer un curseur immédiatement après une instruction INSERT.
modifier -
Voici le code qui exécute la requête
CHECK est une fonction qui vérifie une erreur SQLResult et les journaux si tout retour TRUE en cas de succès, FALSE si l'échec. "status()" utilise SQLGetDiagRec() pour enregistrer le reste des informations d'erreur.
SQLINTEGER nonquery(char * nonquery) { SQLINTEGER rowsAffected = 0 ; SQLHANDLE hStmt ; CHECK(SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hStmt), "allocate handle for statement") ; if(!CHECK(SQLExecDirectA(hStmt, (SQLCHAR*)nonquery, SQL_NTS), "execute query")) { status(SQL_HANDLE_STMT, hStmt, __LINE__) ; } // Get rows affected if(!CHECK(SQLRowCount(hStmt, &rowsAffected), "row count after non-query")) { status(SQL_HANDLE_STMT, hStmt, __LINE__) ; } if(! CHECK(SQLFreeStmt(hStmt, SQL_CLOSE), "Sql free stmt")) { status(SQL_HANDLE_STMT, hStmt, __LINE__) ; } // CLose up. if(!CHECK(SQLCloseCursor(hStmt), "close cursor")) { status(SQL_HANDLE_STMT, hStmt, __LINE__) ; } return rowsAffected ; }
J'appelle nonquery comme si
nonquery("sql statement") ;
Je suis en train de: (qui pourrait être dû à une instruction INSERT n'a pas de curseur)
[24000][0] [Oracle][ODBC]Invalid cursor state.
Dans un premier temps,, et plus tard, après de nombreux inserts (nonquery est simplement appelé beaucoup, plusieurs fois de suite), je reçois
ORA-01000: maximum open cursors exceeded
http://dev.mysql.com/doc/refman/5.1/en/connector-odbc-versions.html dit le pilote MySQL est « Niveau 1 et niveau 2 ". Je crois que mon pilote oracle doit être ODBC 2 http://www.oracle.com/technology/software/tech/windows/odbc/index.html Je pense qu'il est logique que l'instruction d'insertion ne possède pas de curseur .. mais comment est-ce que je continue à "dépasser les curseurs maximum"? – bobobobo
MSDN indique que «curseur non valide» est uniquement renvoyé par un pilote 3.0. Je voudrais oublier MySQL et se concentrer sur Oracle - pouvez-vous poster un petit exemple qui illustre le problème? Vous pouvez également poster la question sur un site plus orienté Oracle car j'ai l'impression qu'il n'y a pas trop d'utilisateurs réguliers - je crains de ne pas le faire moi-même. –