GCC C并将整数传递给PostgreSQL

时间:2018-09-21 07:03:31

标签: c postgresql libpq

我知道可能有很多,但是经过几天的搜索,我找不到如何在Linux下从C到PostgreSQL一次简单地传递integerchar的方法

在PHP中,它很容易,例如123,而在C中使用libpq似乎很不寻常。

我看过PQexecParams,但似乎无济于事。网上的例子也无济于事,这似乎是不可能的任务。

有人会友好地将这个简单的PHP语句转换为C,并向我展示如何在一个INSERT查询中传递多个不同类型的var。

col1 is INT
col2 is CHAR
$int1 = 1;
$char1 = 'text';
$query = "INSERT INTO table (col1, col2) values ('$int1',$char1)";
$result = ibase_query($query);

这将显示我正在尝试做的事情(请注意代码非常错误):

void insert_CommsDb(PGconn *conn, PGresult *pgres, int csrv0) {                                                                                                                                                                                                             const char * params[1];
params[0] = csrv0;

pgres = PQexecParams(conn, "INSERT INTO comms_db (srv0::int) values ($1)",
1,
NULL,
params,
1,
NULL,
0);

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

3 个答案:

答案 0 :(得分:1)

https://www.postgresql.org/docs/current/static/libpq-exec.html

@joop在上面评论: 如果paramTypes参数为NULL,则所有参数均假定为字符串。 因此,您应该将int参数转换为字符串。


void insert_CommsDb(PGconn *conn, int csrv0) 
{
PGresult *pgres;
char * params[1];
char buff[12];

sprintf(buff, "%d", csrv0);

params[0] = buff;

pgres = PQexecParams(conn
        , "INSERT INTO comms_db (srv0::int) values ($1)"  // The query (we dont need the cast here)
        , 1     // number of params
        , NULL  // array with types, or NULL
        , params // array with parameter values
        , NULL  // ARRAY with parameter lenghts
        , NULL  // array with per-param flags indicating binary/non binary
        , 0     // set to 1 if we want BINARY results, 0 for txt
        );

if (PQrresultStatus(pgres) != PGRES_COMMAND_OK)
{
    fprintf(stderr, "INSERT failed: %s", PQerrorMessage(conn));
    exit_nicely(conn,pgres);
}

PQclear(pgres);                                                                                                                                                                                           
}

答案 1 :(得分:0)

wildplasser的回答大致说明了方法。

由于您明确询问了几个参数,因此我将为其添加示例。

如果您不愿意将整数转换为字符串,则可以选择使用相关数据类型的外部二进制格式。这需要内部知识,并且可能需要阅读PostgreSQL源代码。对于某些数据类型,它也可能取决于硬件。

PGresult *res;
PGconn *conn;
Oid types[2];
char * values[2];
int lengths[2], formats[2];
int arg0;

/* connect to the database */

/*  
 * The first argument is in binary format.
 * Apart from having to use the "external binary
 * format" for the data, we have to specify
 * type and length.
 */
arg0 = htonl(42);  /* external binary format: network byte order */
types[0] = 23;     /* OID of "int4" */
values[0] = (char *) &arg0;
lengths[0] = sizeof(int);
formats[0] = 1;

/* second argument is in text format */
types[1] = 0;
values[1] = "something";
lengths[1] = 0;
formats[1] = 0;

res = PQexecParams(
        conn,
        "INSERT INTO mytab (col1, col2) values ($1, $2)",
        2,
        types,
        (const char * const *)values,
        lengths,
        formats,
        0  /* results in text format */
      );

我建议您将文本格式用于大多数数据类型。

值得注意的例外是bytea,使用二进制格式通常是一个优点,因为它可以节省空间和CPU功耗。在这种情况下,外部二进制格式就是字节。

答案 2 :(得分:0)

VS C ++不喜欢htonl(42):

arg0 = htonl(42); / *外部二进制格式:网络字节顺序* /