#sqlite #sql-insert
Вопрос:
Возврат expr, не работающий с sqlite3_exec (), приводит к ошибке ниже в коде C, но отлично работает на терминале sqlite3
sqlite> insert INTO mqtt6 values('abcd',1623066863471168894,1623066863471,119) RETURNING (SELECT sum(size_t) from mqtt6) ;
76041
sqlite>
но когда я пытаюсь выполнить ту же команду из кода C,
я получаю ошибку, как показано ниже:
локи@локи-01 ~/sqlite_dbstat/simple_sqlite — $ ./a.out
bytes_written=0 insert OR REPLACE INTO mqtt6 values ('abcd',1623066863471168258,1623066863471168258,119) RETURNING (SELECT sum(size_t) from mqtt6);
**SQL error: near "RETURNING": syntax error**
полный код на языке Си:
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>
#define TABLE_NAME "mqtt5"
int main(void) {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("test.db", amp;db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %sn", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
//make table
char *sql_cr = "CREATE TABLE IF NOT EXISTS mqtt6 (payload TEXT NOT NULL, timestamp INTEGER , uuid TEXT PRIMARY KEY NOT NULL,size_t INTEGER);";
rc = sqlite3_exec(db, sql_cr, 0, 0, amp;err_msg);
unsigned long long ts=1623066863471168257;
unsigned long long bytes_written=0;
char sql[1000]={''};
char * str="abcd";
sprintf(sql,"insert INTO mqtt6 values ('%s',%llu,%llu,%lu) RETURNING (SELECT sum(size_t) from mqtt6);",str,ts,ts,strlen(str) 8 19 4);
printf("bytes_written=%llu %sn",bytes_written,sql);
rc = sqlite3_exec(db, sql, 0, 0, amp;err_msg);
if (rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %sn", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
return 0;
}
Комментарии:
1. Добро пожаловать в StackOverflow! Не похоже, что вы отправляете ту же команду в коде C, что и в терминале. В терминале вы используете «вставить В mqtt6», в то время как в коде C это «вставить ИЛИ ЗАМЕНИТЬ В mqtt6 «. Если это не проблема, пожалуйста, проверьте строку, которую вы создаете в коде C; у нас здесь нет всего вашего кода, поэтому у нас нет возможности узнать, действительно ли он совпадает с тем, что вы написали в терминале (кроме одного видимого различия). Первое, что нужно сделать, — это проверить свои предположения.
2. Вы распечатали или проверили в отладчике, что находится в строке sql после sprintf и до выполнения sql-запроса?
3. В терминале у вас нет точки после «значений» — вы переходите непосредственно к открытой скобке. В коде C, который вы сначала цитируете, вы делаете. В более крупном блоке кода, который вы включили, я не вижу точки, поэтому я не уверен, какая версия была запущена, когда вы получили ошибку. В любом случае, посмотрите на строку, которую вы создаете с помощью sprintf, и сравните ее со строкой в терминале.