Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
J'ai un problème que j'arrive pas à résoudre.
j'appelle une fonction sql qui utilise un select, et ça marche.
j'appelle une fonction qui utilise un insert et ça ne s'exécute pas.
PGresult* result1;
PGresult* result2;
PGresult* result3;
PGresult* result4;
//sprintf(commande_sql1,"select verify_replicat('192.168.1.1', 'ADC16448521539632AB165', current_timestamp);");
const char *commande_sql1="select * from ips;";
result1 = PQexec(connect_database, commande_sql1);
char *val1 = PQgetvalue(result1,0,0);
printf("%s \n", val1);
if ((PQresultStatus(result1) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 1\n");
PQclear(result1);
}
else {
printf ("commande 1 exécutée\n");
}
//sprintf(commande_sql2,"select verify_replicat('192.168.1.1', 'ADC16448521539632AB165', current_timestamp);");
const char *commande_sql2="select mape_add_ip('192.168.1.4');";
result2 = PQexec(connect_database, commande_sql2);
char *val2 = PQgetvalue(result2,0,0);
printf("%s \n", val2);
if ((PQresultStatus(result2) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 2\n");
PQclear(result2);
}
else {
printf ("commande 2 exécutée\n");
}
//sprintf(commande_sql3,"select verify_replicat('192.168.1.2', 'BCC16448521539632AB165', current_timestamp);");
const char *commande_sql3="select verify_replicat('192.168.1.2', 'BCC16448521539632AB165', current_timestamp);";
result3 = PQexec(connect_database, commande_sql3);
char *val3 = PQgetvalue(result3,0,0);
printf ("%s\n", val3);
if ((PQresultStatus(result3) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 3\n");
PQclear(result3);
}
else {
printf ("commande 3 exécutée\n");
}
//sprintf(commande_sql4,"select verify_replicat('192.168.1.3', 'ADC16448521539632AB165', current_timestamp);");
const char *commande_sql4="select verify_replicat('192.168.1.3', 'ADC16448521539632AB165', current_timestamp);";
result4 = PQexec(connect_database, commande_sql4);
char *val4 = PQgetvalue(result4,0,0);
printf ("%s\n", val4);
if ((PQresultStatus(result4) != PGRES_TUPLES_OK ))
{
fprintf(stderr, "couldnt execute query 4\n");
PQclear(result4);
}
else {
printf ("commande 4 exécutée\n");
}
les deux premières requêtes fonctionnent puisqu'il s'agit d'une sélection simple, et d'une fonction qui utilise la sélection.
les deux dernières ne s'exécutent pas puisqu'ils font appels à une fonction qui ne fait que l'insertion
R.Seif est actuellement connecté
Hors ligne
PGRES_TUPLES_OK est le code de retour lorsque la commande exécutée réussit et renvoie des lignes. PGRES_COMMAND_OK est le code de retour lorsque la commande exécutée réussit mais ne renvoie aucun résultat. Vous devriez donc plutôt utiliser cette variante que la première.
Guillaume.
Hors ligne
Je doute que ce qui est exécuté dans la fonction ait la moindre importance quant à votre code, puisque ce que vous exécutez reste des SELECT.
Vous n'avez aucun message d'erreur ? Rien dans les logs de PostgreSQL non plus ? Que vaut PQresultStatus ?
Marc.
Hors ligne
j'ai ces erreurs ci:
Connection String: hostaddr=217.109.105.136 host=mape-manager user=mape password=pDocr1M! sslmode=require dbname=mapemanager port=5432
connection to DB ok!
commande 1 exécutée
1
NOTICE: l'adresse 192.168.1.14 existe déjà, son ID est le suivant:
commande 2 exécutée
7
row number 0 is out of range 0..-1
couldnt execute query 3
row number 0 is out of range 0..-1
couldnt execute query 4
PQresultStatus me retourne la valeur 7.
Hors ligne
select verify_replicat retourne t'elle un enregistrement ?
vous effectuez PQgetvalue(result3,0,0) sur son résultat, mais y a t'il un enregistrement retourné ?
Marc.
Hors ligne
non, rien.
par contre la fonction mape_add_ip contient l'insert, et ça s'effectue sans problème.
Hors ligne
S'il n'y a pas d'enregistrement retourné, c'est tout à fait normal que PQgetvalue(result3,0,0) ne fonctionne pas.
Le principal problème que je vois dans votre code est le suivant :
On effectue PQresultStatus AVANT PQgetvalue, afin de savoir si on peut récupérer des enregistrements. Pas après.
Par ailleurs, vous devriez vous arranger pour que vos fonctions vous retournent malgré tout un résultat. Un simple booléen par exemple, afin de savoir qu'elles se sont bien exécutées.
Marc.
Hors ligne
:oops:
ça commence à m'enerver.
je n'ai rien comme réponse pour ces deux requêtes.
Hors ligne
en fait c'est ce que je fait avec la fonction verify_replicat, meme s'il y a un message d'erreur je récupère un 0, sinon ça me retourne 1.
Hors ligne
Pages : 1