0

所以我试图在 for 循环中构建我的 sql 语句。
但是在执行时,它在字符串的第一个点显示错误。
连接方法是否错误,因为我打印了 sql 语句并在 postgresql 中手动执行,它可以工作。

我也试过

char *sqlStatement = "INSERT INTO record()..VALUES();\
    INSERT INTO record()..VALUES();\
    INSERT INTO record()..VALUES();
"

这样可行。

请注意,为了简洁起见,我已将循环减少到仅一次并减少了列数。

编码:

char sqlStatement[8000];
for(int i=0;i<1;i++) {
        sprintf(&sqlStatement[0] + strlen(sqlStatement), "INSERT INTO record (\"user_id\", \"filename\", \"ports\", \"timestamp\" ... )VALUES (1, 'example%d', 0, '123456789%d', ... );", i, i,);
}
pgResult = PQexec(pgConn, sqlStatement);
if (PQresultStatus(pgResult) != PGRES_COMMAND_OK) {
        printf("%s", PQresultErrorMessage(pgResult));
        PQclear(pgResult);
        closeSQL(pgConn);
        exit(-1);
}

错误信息:

ERROR:  syntax error at or near ""
LINE 1: INSERT INTO captures ("user_id", "filename", "ports", "time...        
        ^
4

2 回答 2

1

您正在调用strlen(sqlStatement),但sqlStatement此时尚未初始化。那是未定义的行为。

sqlStatement[0] = '\0';

在循环之前以空字符串开始。

顺便说一句,exit(-1)是错误的。唯一的标准 C 退出值是0/EXIT_SUCCESSEXIT_FAILURE。在 Unix 上,您可以使用 和 之间0的任何值255。我不确定Windows,但可能类似。我不知道任何-1有效的操作系统。

于 2013-02-26T03:21:50.170 回答
0
char sqlStatement[11111];
size_t_pos;

pos=0; 
pos += sprintf(sqlStatement+pos, "INSERT INTO record() VALUES(%s);\n" , "Argh!" );
pos += sprintf(sqlStatement+pos, "INSERT INTO record(...);\n" ... );
pos += sprintf(sqlStatement+pos, "INSERT INTO record(...);\n" ... );
...

一个真正的程序当然应该首先检查 sprintf 的返回值,然后再使用它来增加pos位置。

于 2013-02-26T08:37:55.170 回答