«Вставка» в SQLite возвращает SQLITE_OK или SQLITE_DONE? - PullRequest
3 голосов
/ 27 июня 2009

Что возвращает оператор "insert" в SQLite в случае успеха?

Я всегда считал, что это должен быть SQLITE_DONE, но недавно в своих журналах я обнаружил следующую строку:

sqlite3_step error: 'not an error'

А вот код, который регистрирует упомянутую строку:

prepareStatement(addTranslationStmt2, "INSERT INTO translations(lang1_wordid, lang2_wordid) VALUES(?, ?)");
if (!addTranslationStmt2) return -2;

sqlite3_bind_int(addTranslationStmt2, 1, word_id);
sqlite3_bind_int(addTranslationStmt2, 2, translation_id);

if(sqlite3_step(addTranslationStmt2) != SQLITE_DONE)
{
    NSLog(@"sqlite3_step error: '%s'", sqlite3_errmsg(database));
    sqlite3_reset(addTranslationStmt2);
    return -1;
}

sqlite3_reset(addTranslationStmt2);

Мне интересно, почему это работает в большинстве случаев. Должен ли я изменить SQLITE_DONE в своем коде на SQLITE_OK?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 27 июня 2009

SQLITE_DONE

http://www.sqlite.org/c3ref/step.html

Вы также можете попробовать распечатать код ошибки, чтобы выяснить, в чем проблема.

3 голосов
/ 27 июня 2009

В подобных случаях мне нравится смотреть на примеры кода. Вот несколько хороших:

http://sqlite.phxsoftware.com/forums/p/76/6659.aspx

Справочник по кодам результатов SQLite перечисляет SQLITE_OK как указывающий на успешный результат. Это также первый код ошибки, имеющий код ошибки 0, что делает его каноническим результатом (то есть результатом, который я ожидал бы при успешной операции).

Вы должны поместить точку останова или оператор печати в свой код, чтобы выяснить, действительно ли он возвращает ноль, и проверить свои данные, чтобы убедиться, что вы получаете ожидаемый результат. Если это все подтвердится, я бы изменил ваше условие, чтобы проверить SQLITE_OK.

Детали поведения интерфейса sqlite3_step() зависят от того, был ли оператор подготовлен с использованием более нового интерфейса "v2" sqlite3_prepare_v2() и sqlite3_prepare16_v2() или более старого устаревшего интерфейса sqlite3_prepare() и sqlite3_prepare16().

В устаревшем интерфейсе возвращаемое значение будет SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR или SQLITE_MISUSE. С интерфейсом "v2" также могут быть возвращены любые другие коды результатов или расширенные коды результатов.

1 голос
/ 19 августа 2011

Переход с конфигурации «Отладка» на «Выпуск» решил проблему для меня.

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