IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces de programmation Oracle Discussion :

[OCILIB] OCI_GetLastError et requêtes paramétrées


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre à l'essai
    Profil pro
    xcccc
    Inscrit en
    Décembre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : xcccc

    Informations forums :
    Inscription : Décembre 2004
    Messages : 20
    Points : 12
    Points
    12
    Par défaut [OCILIB] OCI_GetLastError et requêtes paramétrées
    Salut,

    j'ai un petit problème avec OCI_GetLastError et les requêtes paramétrées, j'initialise OCILIB avec
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    OCI_Initialize(NULL, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT)
    lorsque j'ai une erreur oracle avec une requête non paramétrée j’obtiens bien quelque chose avec OCI_GetLastError, par contre si une requête paramétrée ne passe pas alors OCI_GetLastError me renvoie toujours NULL.
    J'ai fait l'essai en utilisant un handler pour la gestion des erreurs et je récupère bien l'erreur lors de l’exécution de la requête paramétrée.
    Quelqu'un aurait il une idée du problème ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Salut,

    Petit exemple ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre à l'essai
    Profil pro
    xcccc
    Inscrit en
    Décembre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : xcccc

    Informations forums :
    Inscription : Décembre 2004
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Salut,

    en gros (parce que la gestion de la connexion oracle est encapsulé dans d'autres classes ), j'ai :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    CString szSql = _T( "UPDATE T_PARAM_EQUIPEMENT SET DATEMODIF=:DATEMODIF, VALEUR=:VALEUR WHERE ID_PARAMETRE=:ID_PARAMETRE AND ID_EQUIPEMENT=:ID_EQUIPEMENT" );
    OCI_Statement *st = OCI_StatementCreate(m_database);
    OCI_Prepare(st, szSql);
    OCI_BindDate( st, _T( ":DATEMODIF" ), d );
    OCI_BindString( st, _T( ":VALEUR" ), szValeurParametre, len );
    OCI_BindInt( st, _T( ":ID_PARAMETRE" ), piIdParametre );
    OCI_BindInt( st, _T( ":ID_EQUIPEMENT" ), piIdEquipement );
     
    statut = OCI_Execute(st);
     
    if (!statut)
    {
    	OCI_Error *err = OCI_GetLastError();
     
    	// si erreur
    	if (err != NULL)
    	{
    		sErr = _T(" Error : ");
    		sErr += BO::iToString (OCI_ErrorGetOCICode(err));
    		sErr += _T(" = ");
    		sErr += OCI_ErrorGetString(err);
     
    		diagnostic += sErr;
    	}
    }
    Lorsque j'utilise OCI_Initialize(NULL, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT) et que le statut vaut faux, err est toujours NULL dans le cas des requêtes paramétrées (mais pas avec des requêtes non paramétrées)
    Lorsque j'utilise OCI_Initialize(err_handler, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT), l'erreur est bien catchée et rentre dans la fonction de gestion des erreurs err_handler.

    Pour information l'erreur que je récupère souvent dans err_handler correspond à ORA-01480 pourtant ma chaine de caractère possède bien le caractère de fin.

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Je n'arrive pas a reproduire le soucis. avec une requete paramétrée, j'ai bien une error retournée par OCI_GetLastError() avec le code suivant...

    SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> create table test(value varchar2(10));
     
    Table crÚÚe.
     
    SQL> insert into test values ('test');
     
    1 ligne crÚÚe.
     
    SQL> commit;
     
    Validation effectuÚe.
    C Code :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include "ocilib.h"
     
    void err_handler(OCI_Error *err)
    {
        printf("Error : %s\n", OCI_ErrorGetString(err));
    }
     
    int main(void)
    {
        OCI_Connection *cn = NULL;
        OCI_Statement *st = NULL;
        OCI_Error *err = NULL;
     
        char str[20] = "eeeeeeeeeeeeeeeeee";
     
        OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT | OCI_ENV_THREADED | OCI_ENV_CONTEXT);
     
        cn = OCI_ConnectionCreate(MT("db"), MT("usr"), MT("pwd"), OCI_SESSION_DEFAULT);
        st  = OCI_StatementCreate(cn);
     
        OCI_Prepare(st, "update test set value = :str");
        OCI_BindString(st, ":str", str, 20);
        OCI_Execute(st);
        err = OCI_GetLastError();
     
        if (err)
        {
             err_handler(err);
        }
     
        OCI_Cleanup(); 
     
        return EXIT_SUCCESS;
    }

    output :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Error : ORA-12899: valeur trop grande pour la colonne "USR"."TEST"."VALUE" (rÚelle : 18, maximum : 10)
     
    Error : ORA-12899: valeur trop grande pour la colonne "USR"."TEST"."VALUE" (rÚelle : 18, maximum : 10)
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre à l'essai
    Profil pro
    xcccc
    Inscrit en
    Décembre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : xcccc

    Informations forums :
    Inscription : Décembre 2004
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je viens de refaire un test en forçant le dépassement de capacité de la taille de la colonne pour une chaine de caractères mais toujours aucune remontée de l'erreur par le GetLastError alors qu'avec le handler je la récupère bien.
    Je vais essayer de creuser un peu pour voir si il n'y a pas quelque chose que j'aurai mal fait

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    quelle version de OCILIB et d'Oracle utilises tu ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Membre à l'essai
    Profil pro
    xcccc
    Inscrit en
    Décembre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : xcccc

    Informations forums :
    Inscription : Décembre 2004
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Pour OCILIB c'est la toute dernière : 3.11.1
    Pour ORACLE c'est : 11.2.0.2

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    as tu essayé le code que j'ai posté ?
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    Membre à l'essai
    Profil pro
    xcccc
    Inscrit en
    Décembre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : xcccc

    Informations forums :
    Inscription : Décembre 2004
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    J'essaye de tester ça ce matin et je te tiens au courant, merci de ton aide.

    EDIT:
    avec ton code ça fonctionne ...

    EDIT2:
    je pense avoir trouver mon soucis, après OCI_Execute je fais un OCI_GetSql pour pouvoir écrire dans mon log la requête, si j'enleve OCI_GetSql alors je récupère bien l'erreur avec OCI_GetLastError

  10. #10
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    donc souci résolu
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  11. #11
    Membre à l'essai
    Profil pro
    xcccc
    Inscrit en
    Décembre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : xcccc

    Informations forums :
    Inscription : Décembre 2004
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Résolu oui mais j'aimerai bien récupérer ma requête pour l'afficher dans mon log, est ce que c'est normal que je ne puisse pas récupérer l'erreur après une OCI_GetSql ?

  12. #12
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    OCI_GetLastError est comme la fonction windows GetLastError(), elle retourne une erreur si le dernier appel du caller thread a failé.

    Le status erreur est reseté à chaque appel de l'api...

    Pourquoi utiliser un handler global et un handler contextuel ?

    Au pire je pourrai faire ne sorte que les fonctions OCI_ErrorXXXX() ne mettent pas à jour le flag d'erreur du caller threead... Je vais y reflechir pour la prochaine version de OCILIB....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  13. #13
    Membre à l'essai
    Profil pro
    xcccc
    Inscrit en
    Décembre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : xcccc

    Informations forums :
    Inscription : Décembre 2004
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Ok merci.
    En fait j'utilise normalement que le GetLastError pour récupérer les erreurs, et comme aucune erreur n'était remontée avec les requêtes paramétrées alors que l’exécution renvoyait faux j'ai voulu tester avec un handler global et c'est là que je me suis aperçu du problème que j'avais.
    En attendant une éventuelle modification dans les version ultérieures d'ocilib je vais changer mon code pour récupérer la requête après la gestion de l'erreur.
    Encore merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  2. Requête paramétrée
    Par lou.souleu dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2005, 05h36
  3. [VB.NET] [ADO.NET] Requête paramétrée
    Par DotNET74 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/03/2005, 08h39
  4. Requête paramétrée qui remplit une DBLookUpComboBox
    Par navis84 dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/12/2004, 21h23
  5. VBA & Requête paramétrée
    Par gripoil dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2004, 09h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo