![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
После того, как подготовленный запрос
был подготовлен, используя любой вызов из
sqlite3_prepare_v2(),
sqlite3_prepare_v3(),
sqlite3_prepare16_v2(),
sqlite3_prepare16_v3() или один из старых
интерфейсов sqlite3_prepare() или
sqlite3_prepare16(), эта функция должна быть
вызвана один или несколько раз, чтобы оценить запрос. Детали поведения sqlite3_step() зависят от того, был ли запрос
подготовлен, используя более новый интерфейс "vX",
sqlite3_prepare_v3(),
sqlite3_prepare_v2(),
sqlite3_prepare16_v3(),
sqlite3_prepare16_v2() или старые интерфейсы
sqlite3_prepare() и
sqlite3_prepare16().
Использование нового интерфейса "vX" рекомендуется для новых
запросов, но устаревший интерфейс продолжит поддерживаться. В устаревшем интерфейсе возвращаемое значение будет
SQLITE_BUSY,
SQLITE_DONE,
SQLITE_ROW,
SQLITE_ERROR или
SQLITE_MISUSE. С интерфейсом "v2"
любой из других кодов результата или
расширенных кодов результата
мог бы быть возвращен. SQLITE_BUSY
означает, что ядро базы данных не смогло получить блокировку
базы данных. Если запрос COMMIT
или происходит за пределами явной транзакции, то можно его повторить.
Если запрос не COMMIT
и происходит в рамках явной транзакции, вы должны отменить
транзакцию перед продолжением. SQLITE_DONE
означает, что запрос закончил выполняться успешно. sqlite3_step()
нельзя вызвать снова на этой виртуальной машине без предварительного
sqlite3_reset(), чтобы перезагрузить виртуальную
машину назад к ее начальному состоянию. Если выполняемый SQL-оператор вернет какие-либо данные, то
SQLITE_ROW
возвращен каждый раз, когда новая строка данных готова к обработке.
К значениям можно получить доступ, используя
функции доступа колонки.
sqlite3_step() вызывают снова, чтобы полусить следующую строку данных. SQLITE_ERROR
означает, что произошла ошибка периода выполнения (такая как
ограничительное нарушение). sqlite3_step() нельзя вызвать снова на VM.
Больше информации может быть найдено, вызывая
sqlite3_errmsg().
С устаревшим интерфейсом более определенный код ошибки (например,
SQLITE_INTERRUPT,
SQLITE_SCHEMA,
SQLITE_CORRUPT и т.д.) может быть получен,
вызывая sqlite3_reset() на
подготовленном запросе.
В интерфейсе "v2" более определенный код ошибки возвращен
непосредственно sqlite3_step(). SQLITE_MISUSE
означает, что это вызвали неуместно. Возможно, это вызвали на
подготовленном запросе, который был уже
финализирован,
или на том, который ранее возвратил SQLITE_ERROR
или SQLITE_DONE.
Или могло иметь место, что то же самое соединение с базой данных используется
двумя или больше потоками одновременно. Для всех версий SQLite до и включая 3.6.23.1 требовался запрос
sqlite3_reset() после того, как
sqlite3_step() вернул что-то кроме SQLITE_ROW
перед любым последующим sqlite3_step().
Отказ перезагрузить подготовленный запрос, используя
sqlite3_reset() привел бы к возвращению
SQLITE_MISUSE из
sqlite3_step(). Но после version
3.6.23.1 (2010-03-26 sqlite3_step() начал вызывать
sqlite3_reset()
автоматически при этом обстоятельстве вместо того, чтобы возвратить
SQLITE_MISUSE.
Это не считают разрывом совместимости, потому что любое применение, которое
когда-либо получает ошибку SQLITE_MISUSE, сломано по определению.
Выбор времени компиляции
SQLITE_OMIT_AUTORESET может использоваться, чтобы
восстановить устаревшее поведение. В устаревшем интерфейсе sqlite3_step() API
всегда возвращает универсальный код ошибки
SQLITE_ERROR после любой ошибки, кроме
SQLITE_BUSY и
SQLITE_MISUSE. Необходимо вызвать
sqlite3_reset() или
sqlite3_finalize(), чтобы найти один из
определенных кодов ошибки, которые лучше описывают
ошибку. Мы признаем, что это глупый дизайн.
Проблема была решена с интерфейсом "v2".
Если вы готовите все свои SQL-операторы, используя
sqlite3_prepare_v3(),
sqlite3_prepare_v2(),
sqlite3_prepare16_v2() или
sqlite3_prepare16_v3() вместо
sqlite3_prepare() и
sqlite3_prepare16(), то более определенные
коды ошибок возвращены непосредственно
sqlite3_step(). Использование интерфейсов "vX" рекомендуется.
Choose any three.
SQLite C Interface
Оцените SQL-оператор
int sqlite3_step(sqlite3_stmt*);