Vous n'êtes pas identifié(e).
Ok je vais tester ceci.
Merci beaucoup
Ok.
Alors la table :
CREATE TABLE generalconfiguration (generalconfigid serial8 PRIMARY KEY, generalconfiguration bytea, generalconfigsize int4);
Par contre je n'arrive pas avoir la requête entière car le bytea est trop grand pour être affiché.
Mais je la construit avec :
sprintf(query, "INSERT INTO generalconfiguration(generalconfiguration,generalconfigsize) VALUES('%s',%d) "
"RETURNING generalconfigid as id",
stopConf,
currentConfIndex->endConfSize);
stopconf étant la chaine échappée par la fonction PQescapeByteaConn et currentConfIndex une structure contenant plusieurs info dont la taille de la configuration
Pas de problème pour les chaines, elles semblent tout à fait correctes.
J'obtiens un PGRES_TUPLES_OK mais un champ NULL avec PQgetvalue de ma colonne contenant les bytea
Je confirme, la taille de la chaine est assez grande mais je n'ai toujours rien dans mon bytea
Lorsque j'utilise un sprintf, si ce que je lui donne est trop long pour loger dans la chaine, j'ai un message d'erreur qui arrête l'exécution.
Mais je vais tester en allouant une taille dont je suis sur pour voir, on ne sait jamais
Oui pas de problème de ce côté là. Mon compilateur me préviens si c'est trop petit de toute façon
Je fais l'insertion via une chaine obtenue avec sprintf. Du genre :
sprintf(query, "INSERT INTO ma_table(mon_bytea) VALUES('%s') ",ma_chaine_bytea);
Cette chaine ayant été obtenue par la fonction PQescapeByteaConn qui à priori est bien utilisée puisque je réussie l'insertion de bytea dans d'autres cas
Heu question bête... si la chaine que j'essaie d'insérer dans mon bytea est trop grande est ce que la fonction PQresultErrorMessage renvoie une erreur ?
D'ailleurs pour être sur, quelle est la taille maximum (en caractère) qu'il est possible d'insérer dans un bytea ?
Désolé encore des questions de débutant...
Et me revoilà encore une fois pour un problème étrange.
Je fais l'insertion d'un bytea via mon code C et j'obtiens... un champ vide pour le bytea que je viens d'ajouter (les autres paramètres sont présents par contre)...
Pourtant aucun message d'erreur n'est renvoyé par PQresultErrorMessage, j'ai bien utilisé la fonction faisant les échappements, ma requête contient bien le bytea en question...
Quel test pourrais-je faire pour voir ce qui cloche ?
Oui j'essaie de faire ça.
Je mettrais la solution si je trouve.
Merci
Et voilà j'ai enfin trouvé le temps de faire le test et j'obtiens donc :
ERREUR: séquence d'octets invalide pour l'encodage ┬½ UTF8 ┬╗ : 0xe974e9
HINT: Cette erreur peut aussi survenir si la séquence d'octets ne correspond pas au jeu de caractères attendu par le serveur, le jeu étant contrôlé par ┬½ client_encoding ┬╗.
Merci pour vos réponses, il faut en effet que je regarde ce qu'il y a dans la chaîne d'erreur mais je n'ai pas encore eu le temps.
Par contre j'avais effectivement testé si le client était en UTF-8 à partir de mon programme et c'était bien le cas.
Me revoilà pour une nouvelle question...
J'ai développé une belle dll qui s'occupe de mes fichiers mkt pour transférer leurs données dans la base mais apparemment ça coince avec les accents...
Code en C, développé sous labwindows CVI, sous windows. Base de données en UTF8...
Quand j'exécute une requête INSERT avec une chaine de caractère contenant des accents sous pgAdmin il n'y a pas de problème ça passe. Cependant quand je créais une requête (à l'aide d'un sprintf) dans mon programme puis que je l'envoie elle ne se fait pas si j'ai des accents.
Par exemple si j'ai :
char *param = "été";
char query[100];
sprintf(query, "INSERT INTO ma_table(mon_param) VALUES('%s')",param);
Et bien ça ne fonctionne pas...
Quelqu'un a une idée pour savoir d'où vient le problème ?
Autant pour moi j'ai réussi à me réveiller et à trouver dans les fonctions de libpq celle qui fera mon bonheur : PQescapeByteaConn
A bientôt !
Bonjour,
Je suis à la recherche de l'équivalent en C de cette merveilleuse fonction qu'est pg_escape_bytea mais je ne la trouve pas... Je dois surement être fatigué car elle ne doit pas être bien difficile à trouver... mais bref si quelqu'un l'a déjà rencontré ou utilisé qu'il n'hésite pas à me faire signe
A bientôt
J'avais peur de n'avoir pas d'autres solutions en effet
Merci quand même en tout cas
Encore une question... Désolé ^^
J'ai des DWORD, des WORD et des BYTE (et oui ils se sont bien amusé avec tous les types de ce genre dans la dll que je reprend ^^)
Si je prend l'exemple du DWORD, c'est un unsigned long, donc sur 4 octets... Mais dans postgreSQL il n'y a que des entiers signés...
Comment faire dans ce cas ?
Bonjour,
Je suis également en train de réaliser une dll avec libpq.lib sous Labwindows CVI mais j'ai un problème avec le #include "postgres.h".
A la compilation j'obtiens des erreurs sur elog.h (du genre syntax error; found 'identifier' expecting ';').
As-tu eu ce genre de problème ?
ok je vais me pencher la dessus.
Encore merci à vous.
Bonjour,
Encore une question de débutant... J'utilise un programme C qui manipule des dates au format FILETIME (de windows.h) et je souhaite faire des insertions dans ma base de données qui elle possède des champs timestamp...
Y a-t-il une conversion particulière à réaliser ?
Et pour le sens inverse ?
Merci d'avance pour votre aide et je m'excuse si ma question est très bête...
En relation avec la demande initiale d'amina voici un petit tuto (première réponse du post donné en lien) qui montre comment creer une dll en C avec DevCpp et comment créer une fonction sous PostgreSQL à l'aide de cette dll :
http://www.developpez.net/forums/d65758 … ost5333944
Merci pour votre réponse.
Je suis en effet sous Windows mais finalement j'ai installé devcpp pour coder et il fait la compilation également.
Merci pour votre aide
Encore une petite question pratique : avec quoi compilez vous vos fonctions C ?
Car j'avoue que je m'y perd un peu avec tout ce que j'ai pu lire sur différent forum.
Pour cette partie là pas vraiment de rapport mais je vais par la suite devoir coder la lecture des données de la base par l'un de ces logiciels en utilisant là encore la dll, c'est pourquoi il m'est demandé de me renseigner sur les appels externes
J'aurais encore une question...
Dans le cas où la base est sur un serveur et que les logiciels qui vont communiquer avec celle-ci se situent sur différents ordinateurs du réseau. La solution qui consiste à utiliser la dll directement dans postgreSQL n'est-elle pas la meilleure ?