Vous n'êtes pas identifié(e).

#1 17/09/2014 10:22:23

efluence
Membre

Ecriture d'integer dans une base de données à partir d'un code C

Bonjour,


J'ai installé PostgreSQL 9.3 et souhaite à partir d'un code C communiquer (écrire et lire) dans ma base de donnée. La connexion avec la base de données fonctionne et je suis capable d'écrire dans la base de données mais une question subsiste : je cherche à écrire un "integer" (genre 1, 2, 3, 4...) et dans ma base de données, surprise j'obtiens : 16777216 (=2^24), 33554432 (=2^25), 50331648 (=2^24 + 2^25), 67108864 (=2^26)...


J'ai lu dans la doc de PostgreSQL que les integer sont associés au uint32, mais pourquoi le chiffre "1" est-il associé au 24ème bit ? Comment puis-je procéder pour effectivement lire le "1,2,3,4..." dans ma base de données et non "16777216", etc. ?


La partie de code que j'utilise :
binaryVal = (uint32_t) compteurI; //compteurI est un int

paramValues[0] = (char *) &binaryVal;
paramLengths[0] = sizeof(binaryVal);
paramFormats[0] = 1;        /* binary */


res=PQexecParams(conn,"insert into input(\"T1\") values ($1::integer)",
1, // number parameters
NULL, // let the backend deduce param type
paramValues, //
paramLengths, //
paramFormats, //
1);


Je vous remercie par avance pour toute aide que vous pourrez me fournir !
Bonne journée !

Hors ligne

#2 17/09/2014 11:14:24

gleu
Administrateur

Re : Ecriture d'integer dans une base de données à partir d'un code C

Pourquoi transformez-vous la valeur en uint ? les entiers PostgreSQL sont des entiers signés.


Guillaume.

Hors ligne

#3 17/09/2014 11:34:31

efluence
Membre

Re : Ecriture d'integer dans une base de données à partir d'un code C

Bonjour,


Merci pour votre aide ! J'ai retesté le code sans la ligne
binaryVal = (uint32_t) compteurI; //compteurI est un int


Soit le code suivant :
//binaryVal = (uint32_t) compteurI; //compteurI est un int
paramValues[0] = (char *) &compteurI;
paramLengths[0] = sizeof(compteurI);
paramFormats[0] = 1;        /* binary */


res=PQexecParams(conn,"insert into input(\"T1\") values ($1::integer)",
1, // number parameters
NULL, // let the backend deduce param type
paramValues, //
paramLengths, //
paramFormats, //
1);


Et le codage persiste "1" correspond à 16777216 dans la base de données... ?! Est-ce que ça peut être lié à l'affichage des colonnes de ma base de données ?

Hors ligne

#4 20/09/2014 16:47:24

gleu
Administrateur

Re : Ecriture d'integer dans une base de données à partir d'un code C

Il vous faut aussi transformer la valeur entière suivant le "network byte order", autrement dit :

compteurI = htonl(1);


Guillaume.

Hors ligne

Pied de page des forums