0

だから私はforループで自分のsqlステートメントを構築しようとしています。
ただし、実行すると、文字列の最初のポイントでエラーが表示されます。
連結方法が間違っていますか?sqlステートメントを出力してpostgresqlで手動で実行すると、機能します。

また、私は試しました

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

それはうまくいきます。

簡潔にするために、ループを1回だけに減らし、列の数を減らしたことに注意してください。

コード:

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_SUCCESSと。のみEXIT_FAILUREです。0Unixでは、との間の任意の値を使用できます255。Windowsについてはよくわかりませんが、おそらく似ています。-1有効なOSがわかりません。

于 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" ... );
...

もちろん、実際のプログラムでは、pos位置をインクリメントするために使用する前に、まずsprintfからの戻り値を確認する必要があります。

于 2013-02-26T08:37:55.170 に答える