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

#1 Re : Général » [libpq] ERREUR: longueur invalide dans la valeur externe ½ numeric » 28/11/2008 11:57:04

bon alors, j'avance


http://pastebin.com/m1860cc27

la ou je comprend pas, c'est que si je met
intValues[0] =5;
      dans la db, j'ai   83886080
et si je met
intValues[0] =83886080;

dans la db, j'ai 5.

ha vi et 83886080 en hexa , cela donne 5000000

KEZAKO???? comprend plus trop :-(

merci

a++

#2 Re : Général » PQexecPrepared : le curseur myportal existe deja » 28/11/2008 11:55:11

en fait, j'ai du faire ceci

   res =  PQprepare  (conn,
                                 "cursor_name",
                                 "DECLARE select_cursor CURSOR WITH HOLD FOR select * from tab_3 WHERE col_3 = $1",
                                 1,       /* one param */
                                 NULL);

le truc, c'est que dans l'application reel, le open et le fetch sont appelé via des progrma (au sens cobol) different.  et donc je ne sais pas faire de begin end ( car je ne saurais pas quand faire le end)

merci pour ntout

a++

#5 Re : Général » [libpq] ERREUR: longueur invalide dans la valeur externe ½ numeric » 27/11/2008 15:47:02

c'est la version 8.3 de postgres
et lenthtvalues[0] = 8   c'est le second chiffre imprimé par
printf("%f  %d\n",realvalue[0],LengthValues[0]);
et donc 2.200000  8


merci

a+++

#6 Re : Général » [libpq] ERREUR: longueur invalide dans la valeur externe ½ numeric » 27/11/2008 15:29:45

salut et merci

la requete est ceci

res =  PQprepare  (conn,
                       "",
                       "INSERT INTO tab_3 VALUES ($1, 2, 'kk')",
                       1,       /* one param */
                       NULL);

et le printf donne ceci

2.200000  8

les données sont declaré comme ceci
double  realvalue[5];


merci

a++

#7 Général » [libpq] ERREUR: longueur invalide dans la valeur externe ½ numeric » 27/11/2008 15:08:13

elekis
Réponses : 7

bonjour,

voila, je comprend pas trop, j'ai l'erreur suivante sur cette petite portion de code


 char *paramValues[5];
    int   LengthValues[5];
    int   FormatValues[5];
    
     ...

     realvalue[0] = 2.2;
     paramValues[0] = (char*)&realvalue[0];
     LengthValues[0] = sizeof(realvalue[0]);
     printf("%f  %d\n",realvalue[0],LengthValues[0]);
     FormatValues[0] = 1;

     res = PQexecPrepared(conn,
                          "",
                          1,
                          paramValues,
                          LengthValues,
                          FormatValues,
                          1);

     testres(res);

j'ai l'erreur suivante, et je ne sais pourquoi :
longueur invalide dans la valeur externe ½ numeric


si je comprend bien il rale sur le fait que la longeur est mauvaise mais bon , c'est la longueur d'un double

je sais pas si cela a avoir mais voici comment la table est creer
CREATE TABLE tab_3 (col_1 numeric(53,2), col_2 BIGINT, col_3 TEXT)

si qqn a une idée.??

merci

a++

#8 Re : Général » PQexecPrepared : le curseur myportal existe deja » 27/11/2008 15:02:43

c'est bon, j'ai trouve, il faut faire un close cursor

a++

#9 Général » PQexecPrepared : le curseur myportal existe deja » 25/11/2008 13:58:17

elekis
Réponses : 3

bonjour, je remet mon message ici en esperant avoir un peu plus de chanse

voila, j'essaie de faire un simple petit programme avec des cursors et des variables dynamique (les $X) en C. le but etant que j'arrive a changer la variable sans refaire le prepare .

je fait donc 

 PQprepare  (conn,
                       "my_cursor",
                       "DECLARE myportal CURSOR FOR select * from tab_3 WHERE COL_3 = $1",
                       1,       /* one param */
                       NULL);

une seul fois
et puis je fais un

  paramValues[0]= "zzze";
    res = PQexecPrepared(conn,
                         "my_cursor",
                         1,
                         paramValues,
                         NULL,
                         NULL,
                         1);

ensuite je fetch (tout fonctionne)
et puis ben j'aimerais bien changer la valeur du param
je fais donc un

    paramValues[0]= "ee";
    res = PQexecPrepared(conn,
                       "my_cursor",
                        1,
                        paramValues,
                        NULL,
                        NULL,
                        1);

et la cela foire. j'ai le message
ERREUR:  le curseur ½ myportal ╗ existe dÚjÓ
or je sais qu'il existe, c'est le but big_smile.

qqn aurait il une idée de pourquoi??? et comment resoudre

merci a++

voici le code complet (basé sur un example)

/*
 * testlibpq.c
 *
 *      Test the C version of libpq, the PostgreSQL frontend library.
 */
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    exit(1);
}

PGresult* FetchFirst(PGconn * conn){
    PGresult* res = PQexec(conn, "FETCH FIRST in myportal");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "FETCH  failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    return res;
}


int
main(int argc, char **argv)
{

    PGconn     *conn;
    PGresult   *res;
    int         nFields;
    int         i,
                j;
    const char *paramValues[1];


    conn = PQsetdbLogin("localhost", NULL, NULL,NULL, "dbu", "root","ouvretoi");

    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }

    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
     PQclear(res);
     res =  PQprepare  (conn,
                       "my_cursor",
                       "DECLARE myportal CURSOR FOR select * from tab_3 WHERE COL_3 = $1",
                       1,       /* one param */
                       NULL); 

    PQclear(res);

    paramValues[0]= "zzze";
    res = PQexecPrepared(conn,
                         "my_cursor",
                         1,
                         paramValues,
                         NULL,
                         NULL,
                         1);

    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);


    res = FetchFirst(conn);

    nFields = PQnfields(res);
    for (i = 0; i < nFields; i++)
        printf("%-15s", PQfname(res, i));
    printf("\n\n");

    while(PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
    {
            for (j = 0; j < nFields; j++)
                printf("%-15s", PQgetvalue(res, 0, j));
            printf("\n");
            PQclear(res);
            res = PQexec(conn, "FETCH NEXT in myportal");
    }
    PQclear(res);


    paramValues[0]= "ee";
    res = PQexecPrepared(conn,
                       "my_cursor",
                        1,
                        paramValues,
                        NULL,
                        NULL,
                        1);

    fprintf(stderr, " %s", PQerrorMessage(conn));
    res = FetchFirst(conn);


    /* first, print out the attribute names */
    nFields = PQnfields(res);
    for (i = 0; i < nFields; i++)
        printf("%-15s", PQfname(res, i));
    printf("\n\n");

    while(PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
    {
            for (j = 0; j < nFields; j++)
                printf("%-15s", PQgetvalue(res, 0, j));
            printf("\n");
            PQclear(res);
       res = PQexec(conn, "FETCH NEXT in myportal");
    }
    PQclear(res);


    res = PQexec(conn, "CLOSE myportal");
    PQclear(res);

    /* end the transaction */
    res = PQexec(conn, "END");
    PQclear(res);

    /* close the connection to the database and cleanup */
    PQfinish(conn);

    return 0;
}

Pied de page des forums

Propulsé par FluxBB