2012-06-02 1 views
2

J'ai une table simple appelée mytable2 avec une seule colonne, nom comme varchar2 (20). J'ai maintenant une liste de noms stockés comme vecteur de std :: string à insérer dans la table. Je veux utiliser executeArrayUpdate, donc je dois d'abord faire le setDataBuffer. Cependant, comme je pouvais le voir, les gens utilisent toujours char [] [20] pour définir le tampon de données. Cela me laisse un grand mal de tête, car j'ai deux problèmes ici, d'abord est de convertir de vecteur en tableau, la seconde est de convertir la chaîne en char. 1er, j'ai fatigué d'utiliser le vecteur de char [20], et cela ne compile pas. Googled et ils disent que le vecteur ne peut pas prendre char [], j'ai donc changé mon vecteur de std :: string en vector de char *. Deuxièmement, j'ai essayé d'arrêter le vecteur en utilisant "void * p = & names [0]", car certaines personnes disent de cette façon que nous pouvons utiliser des vecteurs comme tableau. J'ai utilisé stmt-> setDataBuffer (1, mystring, OCCI_SQLT_STR, 20, NULL), et le programme compilé et exécuté bien, mais quand je "sélectionne le nom de mytable2", il a montré seulement quelques charaters étranges.Comment utiliser le vecteur <string> dans OCCI setDataBuffer?

Quelqu'un a déjà eu un problème similaire auparavant? que devrais-je faire?

Mon code est simple comme ci-dessous:

count=2; 
    vector<char*> mystring; 
    for(int i=0;i<count;i++) 
    { 
     char my[20]; 
     strcpy_s(my,"Michael"); 
     mystring.insert(mystring.end(),my); 
      } 
    stmt->setDataBuffer(1,&mystring[0],OCCI_SQLT_STR,20,NULL); 

    stmt->setBatchErrorMode (true); 

    stmt->executeArrayUpdate(count); 

Répondre

0

Vous auriez besoin de créer dynamiquement le tableau de caractères que vous mettez dans le vecteur pour qu'il ait une chance de fonctionner correctement.

Je ne l'ai pas utilisé CICO, mais si je devais utiliser l'API qui a demandé char [] [20], je lui donnerais char [] [20]

Si vous avez vos données existantes dans le vecteur, pourquoi ne pas simplement le copier dans le tableau de char 2D? Par exemple.

// intialise vector with nonsense 
unsigned int const VEC_SIZE = 2 ; 
vector<string> v; 
for (unsigned int i = 0; i < VEC_SIZE; ++i) { 
    stringstream s; 
    s << "Jon Paul " << i << endl; 
    v.push_back (s.str()) ; 
} 

// create the required 2D char array 
unsigned int const STR_LEN = 20 ; 
char c [VEC_SIZE][STR_LEN]; 

// copy the data from the vector of strings to the 2D char array 
for (unsigned int i = 0; i < VEC_SIZE; ++i) { 
    string s = v[i].substr(0,STR_LEN); 
    char const * const cc = s.c_str();  
    unsigned int j = 0; 
    for (; j < STR_LEN && j < s.size(); ++j) { 
     c[i][j] = cc[j]; 
    } 
    c[i][ j==STR_LEN ? 20 : j ] = 0; // write NULL character 
} 

Je suppose que vous avez simplifié votre exemple être un vecteur de taille fixe, donc ma réponse va être simplifiée, avec l'épineuse question de l'allocation dynamique des tableaux 2D gauche comme un exercice pour le lecteur ...

+0

Merci beaucoup pour votre réponse. – Michael

+0

Merci beaucoup pour votre réponse. J'allais envelopper les fonctions OCCI pour interroger l'insertion, la suppression, la mise à jour d'une table (n'importe quelle table), de sorte que tout ce que je dois donner est les noms de champs et les valeurs, puis le programme devrait lire automatiquement le schéma et insérez dans Oracle. J'avais l'habitude de le faire dans OPN.Net, mais je veux que mon programme soit performant et j'écris à nouveau en C++, y compris les algorithmes, bases de données, webservices, etc. Je pense que je devrais écrire une fonction pour convertir ces vecteurs à quelque chose comme char **? – Michael

+0

Oui. Vous pourriez probablement vous rendre la vie plus facile en faisant en sorte que votre fonction de conversion fasse aussi l'appel à OCCI. Avant de commencer tout cela, je voudrais savoir que réimplémenter tout en C++ rendrait les choses plus rapides. Vous avez besoin d'un moyen d'analyser les goulets d'étranglement dans votre code .Net existant. – wreckgar23

Questions connexes