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 :

[OCI]OCIBindByName & liage de tableaux


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut [OCI]OCIBindByName & liage de tableaux
    Je vise une colone de type VARCHAR2[75] pour une insertion par lots. Je tente donc d'envoyer un tableau de char*, en vain.
    Code : 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
     
      char* linkedStrings[ 3 ];
      linkedStrings[ 0 ] = new char[ 2 ];
      strcpy( linkedStrings[ 0 ], "A" );
      linkedStrings[ 1 ] = new char[ 2 ];
      strcpy( linkedStrings[ 1 ], "B" );
      linkedStrings[ 2 ] = new char[ 2 ];
      strcpy( linkedStrings[ 2 ], "C" );
     
      ub2 eltSizes3[ 3 ];
      eltSizes3[ 0 ] = strlen( linkedStrings[ 0 ] ) + 1;
      eltSizes3[ 1 ] = strlen( linkedStrings[ 1 ] ) + 1;
      eltSizes3[ 2 ] = strlen( linkedStrings[ 2 ] ) + 1;
     
      OCIBind* pBindh3;
      char* name3 = ":col5";
      st = ::OCIBindByName( m_pStmt, &pBindh3, m_pErr, 
                            reinterpret_cast< text* >( name3 ), strlen( name3 ), 
                            &linkedStrings, 2, SQLT_VCS, 
                            NULL, (ub2*) eltSizes3, NULL, 
                            0, NULL, OCI_DEFAULT );
      if ( st != OCI_SUCCESS && st != OCI_SUCCESS_WITH_INFO ) {
        CString ret = GetErrorText( m_pErr );
        cout << ret.GetBuffer( 0 ) << endl;
        return false;
      }
     
      st = ::OCIStmtExecute( m_pService, m_pStmt, m_pErr, iters, 0, NULL, NULL, OCI_DEFAULT );
      if ( st != OCI_SUCCESS && st != OCI_SUCCESS_WITH_INFO ) {
        CString ret = GetErrorText( m_pErr );
        cout << ret.GetBuffer( 0 ) << endl;
        return false;
      }
    Sur ce code, j'obtiens une erreur ORA-01459 error : longueur non valide pour une chaîne de caractères variable.

    Si je déclare du SQLT_S, j'obtiens l'erreur : ORA-01480 :valeur indéfinie à la fin absent de la valeur de lien STR.

    Si je déclare du SQLT_CHR (en enlevant le +1 sur le strlen ou pas), les 3 inserts sont faits, mais les caractères insérés sont illisibles.

    Qu'est-ce que je fais de travers, selon vous ?

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Es-tu obligé de passer directement par la couche OCI d'oracle ?

    Ne peux-tu pas employer une librairie te facilitant le travail ?

  3. #3
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    OCI obligatoire. Mon employeur actuel utilisait OO4O, mais à décidé de migrer vers OCI, d'où le travail de ré-écriture en cours (et les appels désespérés que je lance épisodiquement en forum )

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Je ne connais pas OO4O, peux-tu m'en dire un peu plus ? d'après une petite recherche sur google, il s'agit d'un composant COM pour t'interfacer avec Oralce via du OLE.

    Quel outil utilises-tu pour développer ? Borland, Visual ou autre

  5. #5
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    OO4O est l'acronyme pour : Oracle Objects for OLE. C'est une interface C++ orientée objets, qui encapsule les fonctionnalités standard pour le travail sur les bases. Présentation officielle dans l'aide en ligne :
    Oracle Objects for OLE (OO4O) is a product designed to allow easy access to data stored in Oracle databases using any programming or scripting language that supports the Microsoft COM Automation and ActiveX technology. These languages include Visual Basic, Visual C++, Visual Basic For Applications (VBA), and IIS Active Server Pages (VBScript and JavaScript). OO4O consists of an in-process COM Automation Server, the C++ class library, and the Oracle Data Control. Relationships shows the high-level relationship between OO4O components.
    Je développe sous Visual Stupido (VC6). sous Windows XP.

    NB : j'ai réussi à contourner ce problème de liage d'un tableau de char* en passant par un tableau d'OCIString*. Ca marche, les perfs ne changent pas, donc je m'en contenterai. Néanmoins, contourner un problème n'est pas le résoudre...

Discussions similaires

  1. 4D OCI - Problème avec OCIBindByName
    Par Jeffsmi dans le forum 4D
    Réponses: 2
    Dernier message: 29/06/2007, 14h45
  2. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44
  3. Réponses: 6
    Dernier message: 04/04/2003, 15h28
  4. Les tableaux en PL/SQL
    Par GRUMLY dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/08/2002, 18h10

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