Не удается подготовить оператор INSERT в SQLITE, C API - PullRequest
0 голосов
/ 18 октября 2010
  /* DATABASE INIT */

ret = sqlite3_open_v2(dbfile, &DB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);

if (SQLITE_OK != ret) {
    printf("Could not open database.\n");
    exit(1);
}

const char* zSql = "INSERT INTO abc VALUES (?)";
ret = sqlite3_prepare_v2(sites[DB, zSql, strlen(zSql), &s, NULL);

if (SQLITE_OK != ret) {
    printf("Could not compile statement '%s', got %d.\n", zSql, ret);
    exit(1);
}

Ну вот, пожалуйста. В чем дело? sqlite3_prepare_v2 всегда терпит неудачу.

Обновление: Я попробовал предложения до сих пор, но без сигары. Я создал простейший случай, о котором я мог подумать, со схемой:

CREATE TABLE abc(a INTEGER);

И код C, как указано выше, все еще не работает, получает сообщение «Не удалось скомпилировать оператор» получил код возврата 26, который, по-видимому, означает SQLITE_NOTADB. Так что, похоже, мой файл базы данных не ... файл базы данных. Странно, мне придется разобраться в этом.

CLI sqlite принимает файл и может показать схему, если я использую команду ".dump".

Я изменил имя файла базы данных с «data.db» на «data.sqlite». Теперь я получаю код возврата 1, вместо этого SQLITE_ERROR.

Обновление: Я обращался к неправильному файлу, AKA ошибка пользователя . Принятие одного из ответов, который указал на синтаксическую ошибку в моем неотредактированном вопросе.

Ответы [ 2 ]

3 голосов
/ 18 октября 2010

Я думаю, вам следует попробовать

const char* zSql = 
    "INSERT INTO abc (moderation_status, phonenumber, email) VALUES(?,?,?)";

, предполагая, что moderation_status phonenumber и email являются именами полей в вашей таблице.

или:

const char* zSql = "INSERT INTO abc VALUES(?,?,?)";

? - это место, где будут вставлены аргументы.

2 голосов
/ 18 октября 2010

Вы не предоставили список значений;Вы указали список имен (предположительно, имена столбцов), для которых необходим список значений.

Вам может понадобиться:

char* zSql = "INSERT INTO abc(moderation_status, phonenumber, email) "
             "VALUES('U', '212-234-6678', 'example@example.com')";

Или вы можете не беспокоиться об именах столбцов:

char* zSql = "INSERT INTO abc VALUES('U', '212-234-6678',"
             "'example@example.com')";

Или вы можете использовать заполнители:

char* zSql = "INSERT INTO abc VALUES(?, ?, ?)";

Если вы используете заполнители, вы должны будете предоставить соответствующие значения при выполнении оператора.(Но заполнители, как правило, являются лучшим решением - они избегают проблем SQL-инъекций .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...