2017-04-19 2 views
0

J'utilise setDataBuffer pour récupérer les lignes renvoyées d'une procédure stockée via un curseur car setPrefetchRowCount ne semble pas fonctionner dans ce cas. L'utilisation de setDataBuffer fonctionne correctement lorsque le tampon est supérieur au nombre total de lignes renvoyées. Dans mon cas, j'ai testé le tampon peut accueillir 5000 lignes et le nombre de lignes retournées sont 538. Lorsque je réduis le tampon à une longueur de 100 (max_numrows = 100 ci-dessous), il travaille les trois premiers appels à next (max_numrows) et donne exactement le même résultat que lorsque le tampon est grand. Cependant, au quatrième appel, j'obtiens l'exception ORA-01406: la valeur de la colonne récupérée a été tronquée. Que se passe-t-il et comment puis-je résoudre le problème?Oracle OCCI setDataBuffer provoquant ORA-01406: la valeur de la colonne récupérée a été tronquée

static const size_t max_numrows=5000; 
char var_buf[max_numrows][7]; 
char sym_buf[max_numrows][9]; 
rs->setDataBuffer(1,var_buf,oracle::occi::OCCI_SQLT_STR,sizeof(var_buf[0]),(ub2*)0); 
rs->setDataBuffer(2,sym_buf,oracle::occi::OCCI_SQLT_STR,sizeof(sym_buf[0]),(ub2*)0); 
sym.resize(var.size()); 
size_t fetch_count=0; 
while(rs->next(max_numrows)==ResultSet::DATA_AVAILABLE) 
{ 
    for(size_t i=0;i<rs->getNumArrayRows();++i) 
    { 
     var[fetch_count*max_numrows+i]=var_buf[i]; 
     sym[fetch_count*max_numrows+i]=sym_buf[i]; 
    } 
    ++fetch_count; 
} 

Database

enter image description here

Répondre

0

ce n'est pas sur les lignes, mais sur la largeur de la colonne. Une valeur extraite de la base de données a plus de 7 resp. 9 octets.

+0

Lorsque vous lisez la documentation sur le code d'erreur oui, mais je ne vois pas que c'est le cas ici: Premièrement, je sais pertinemment que les chaînes récupérées ne sont pas plus longues que 6 resp. 8 caractères Deuxièmement, cela fonctionne très bien en utilisant la même largeur de tampon lorsque le tampon est plus long. – user2672165

+0

essayez d'exécuter la requête dans SQL Developer et utilisez la fonction de vidage sur les deux colonnes. 7 octets peuvent être différents de 7 caractères. La conversion de charset est également implémentée du côté client, indépendamment du charset de notre application, vous recevez des chaînes codées dans le charset natif de db. Assurez-vous de multiplier les deux largeurs de colonnes par 4 (4 octets par caractère Unicode). – ibre5041

+0

Oui, vous avez raison. Les données dans la base de données étaient incorrectes et je m'assurerai que les données rentreront dans le tampon. – user2672165