以编程方式查找受Postgres COPY影响的行数

时间:2009-02-19 21:06:51

标签: c postgresql

我正在使用Postgres 8.2和相关联的用于ANSI C的libpq库。我已经浏览了文档,但未找到能够提供特定信息的内容。

在文档的“COPY”部分中,“输出”描述如下:

  

成功完成后,COPY命令将返回形式为
的命令标记   COPY计数
  计数是复制的行数。

假设conn指的是有效的PGconn *, 我以为我可以使用这样的东西来返回复制的行数:

     sprintf(queryString, "COPY table FROM '%s' WITH DELIMITER '|'", 
            tempFileName);
    fprintf(stderr, "COPY all records: %s\n", queryString);
    res = PQexec(conn, queryString);
    bResultErr = (PQresultStatus(res) != PGRES_COMMAND_OK);
    if (bResultErr) {
        PQclear(res);
         fprintf(stderr, "Aborting:DELETE failed: %s\n", 
                 PQerrorMessage(conn));
         PQfinish (conn);
         exit (1);
    } else {
        // Display how many records were COPY'd
        fprintf(stderr, "COPY completed: %d rows imported\n", 
                PQntuples(res));
        PQclear(res);
    }

然而,尽管行 已导入,但输出总是“COPY已完成:已导入0行”。

我会很感激任何提示

3 个答案:

答案 0 :(得分:3)

 fprintf(stderr, "COPY completed: %s rows imported\n", PQcmdTuples(res));

注意%s这里,它是一个字符串,而不是一个整数。

答案 1 :(得分:3)

PQntuples()返回查询结果中的行数,即0。它返回一个int类型。

PQcmdTuples()返回您发出的sql-command影响的行数(在本例中为COPY)。它返回一个char类型。

答案 2 :(得分:1)

我认为您需要使用PQcmdTuples()而不是PQntuples()。