2013-02-26 59 views
0

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

而且曾试图

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...   
     ^

回答

1

你打电话strlen(sqlStatement)sqlStatement在这一点上被初始化。这是未定义的行为。

sqlStatement[0] = '\0'; 

循环之前与一个空字符串开始了。

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

+0

啊......这解决了我的头痛。谢谢! 也将改为标准方法。 :) – resting 2013-02-26 04:01:20

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位置之前。