Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/03/2006, 17h45   #1
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 771
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 771
Points : 790
Points : 790
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 :
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 ?
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2006, 18h35   #2
Membre chevronné
 
Homme Stéphane Wirtel
Consultant ERP
Inscription : février 2004
Messages : 636
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Wirtel
Localisation : Belgique

Informations professionnelles :
Activité : Consultant ERP

Informations forums :
Inscription : février 2004
Messages : 636
Points : 736
Points : 736
Envoyer un message via Skype™ à swirtel
Es-tu obligé de passer directement par la couche OCI d'oracle ?

Ne peux-tu pas employer une librairie te facilitant le travail ?
swirtel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 08h59   #3
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 771
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 771
Points : 790
Points : 790
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 )
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2006, 11h24   #4
Membre chevronné
 
Homme Stéphane Wirtel
Consultant ERP
Inscription : février 2004
Messages : 636
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Wirtel
Localisation : Belgique

Informations professionnelles :
Activité : Consultant ERP

Informations forums :
Inscription : février 2004
Messages : 636
Points : 736
Points : 736
Envoyer un message via Skype™ à swirtel
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
swirtel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2006, 12h04   #5
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 771
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 771
Points : 790
Points : 790
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 :
Citation:
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...
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h53.


 
 
 
 
Partenaires

Hébergement Web