用C接口PGgetvalue 获取PG数据库里面的interge类型的数据时,输出的是负数,但是interge类型数据本身是正数,PGgetvalue 返回类型为char * ,已被强转为int *型,求高人指点

解决方案 »

  1.   

    给你一个非常简单的例子:
    #include <stdio.h>
    #include <stdlib.h>
    #include <libpq-fe.h>
    static void exit_nicely(PGconn* conn)
    {
        PQfinish(conn);
        exit(1);
    }int
    main(int argc, char **argv)
    {
        const char *conninfo;
        PGconn     *conn;
        PGresult   *res;
        int         nFields;
        int         i,
                    j;    if (argc > 1)
            conninfo = argv[1];
        else
            conninfo = "dbname = iihero";    conn = PQconnectdb(conninfo);    if (PQstatus(conn) != CONNECTION_OK)
        {
            fprintf(stderr, "Connection to database failed: %s",
                    PQerrorMessage(conn));
            exit_nicely(conn);
        }    /* create a table in advance */
        /* create table t123(id integer primary key, col2 varchar(32)) */
        /* insert into t123 values(100, 'wang') */
        /* Start a transaction block */
        res = PQexec(conn, "SELECT * FROM t123");
        if (PQresultStatus(res) != PGRES_TUPLES_OK)
        {
            fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
            PQclear(res);
            exit_nicely(conn);
        }    /* first, print out the attribute names */
        nFields = PQnfields(res);
        for (i = 0; i < nFields; i++)
            printf("%-15s", PQfname(res, i));
        printf("\n\n");    for (i = 0; i < PQntuples(res); i++)
        {
            for (j = 0; j < nFields; j++)
                printf("%-15s", PQgetvalue(res, i, j));
            printf("\n");
        }    PQclear(res);    PQfinish(conn);    return 0;
    }
    结果是:
    id             col2100            wang
      

  2.   

    获取的数据除了interge型都是正常的,整形没越界,4位数
      

  3.   

    PQgetvalue返回的是以\0结束的字符串,将其转换成int即可。
    char* res = PQgetvalue(....);
    判断一下res是否为空,或者调用PQgetisnull()先。
    int n = atoi(res);
    这样也会溢出?
      

  4.   

    问题解决了,用ntohl字节序转换就可以了,但是想不通的是,这个PG数据怎么跟字节序有关系?
      

  5.   


    那你的正数是如何读出来的?通过psql命令行?
    你的客户端程序,是在x86平台上,服务器用的是sparc或者别的不同架构上?
    能具体说说你的环境吗?
      

  6.   

    正数是通过c语言接口啊PQgetvalue,红帽
      

  7.   

    红帽也只是操作系统,大小端只跟CPU架构(类型)有关。
    psql也是用c api实现的。
    你是在什么情况下得到正数的(通过什么客户端,客户端机器的具体环境(CPU,操作系统))?
    什么情况下得到负数的(通过什么客户端,客户端机器的具体环境(CPU,操作系统))?
    只有弄清楚了这些,才知道根本原因。
    谨慎怀疑是环境问题。
      

  8.   

     1  Intel(R) Pentium(R) Dual  CPU  E2180  @ 2.00GHz
    这个是cpu的信息,其实是在本机的虚拟机上运行的
    内核版本:Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux
    正数和负数都是通过这个虚拟机上的linux获得
      

  9.   

    那都是小端编码了,怎么可能会是这样的结果?你的正数,是如何生成到库表里头的? 在完全相的环境下,一个是使用psql命令行,一个是使用libpsql.so获取结果,一正一负,几乎不可能。