Vous n'êtes pas identifié(e).
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
Pourquoi transformez-vous la valeur en uint ? les entiers PostgreSQL sont des entiers signés.
Guillaume.
Hors ligne
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
Il vous faut aussi transformer la valeur entière suivant le "network byte order", autrement dit :
compteurI = htonl(1);
Guillaume.
Hors ligne