Sqlite error code

Многие подпрограммы в интерфейсе на языке C SQLite возвращают числовые коды результатов, указывающие на успех или неудачу, а в случае неудачи - на некоторое представление о причине сбоя. В этом документе делается попытка объяснить, что означает каждый из этих числовых кодов результатов.

Коды результатов и ошибок

Overview

Многие подпрограммы в интерфейсе на языке C SQLite возвращают числовые коды результатов, указывающие на успех или неудачу, а в случае неудачи — на некоторое представление о причине сбоя. В этом документе делается попытка объяснить, что означает каждый из этих числовых кодов результатов.

1.Коды результатов против кодов ошибок

«Коды ошибок» — это подмножество «результирующих кодов», которые указывают на то, что что-то пошло не так. Есть только несколько кодов результатов без ошибок: SQLITE_OK , SQLITE_ROW и SQLITE_DONE . Термин «код ошибки» означает любой код результата, отличный от этих трех.

2.Коды первичных результатов по сравнению с кодами расширенных результатов

Коды результата-это подписанные 32-битные целые числа.Наименее значащие 8 бит кода результата определяют широкую категорию и называются «первичным кодом результата».Более значащие биты дают более подробную информацию об ошибке и называются «расширенным кодом результата».

Обратите внимание,что первичный код результата всегда является частью расширенного кода результата.При полном 32-битном расширенном результирующем коде приложение всегда может найти соответствующий код первичного результата,просто извлекая из расширенного результирующего кода наименее значащие 8 бит.

Все расширенные коды результатов также являются кодами ошибок.Поэтому термины «расширенный код результата» и «расширенный код ошибки» являются взаимозаменяемыми.

Для исторической совместимости интерфейсы на языке C по умолчанию возвращают первичные коды результатов. Расширенный код результата для самой последней ошибки можно получить с помощью интерфейса sqlite3_extended_errcode () . Интерфейс sqlite3_extended_result_codes () можно использовать для перевода соединения с базой данных в режим, в котором он возвращает расширенные коды результатов вместо основных кодов результатов.

3. Definitions

Все коды результатов — целые числа. Символические имена для всех результирующих кодов создаются с помощью макроса «#define» в заголовочном файле sqlite3.h. В заголовочном файле sqlite3.h есть отдельные разделы для определений кода результата и расширенных определений кода результата .

Код первичного результата-символические имена формы «SQLITE_XXXXXX»,где XXXXXX-это последовательность заглавных алфавитных символов.Расширенные кодовые имена результата относятся к форме «SQLITE_XXXXXX_YYYYYYY»,где XXXXXX часть является соответствующим первичным кодом результата,а YYYYYY является расширением,которое далее классифицирует код результата.

Названия и числовые значения для существующих кодов результатов являются фиксированными и неизменными.Однако в будущих релизах SQLite могут появиться новые коды результатов,и особенно новые расширенные коды результатов.

4.Перечень кодов первичных результатов

31 код результата определены в sqlite3.h и перечислены в алфавитном порядке ниже:

  • SQLITE_ABORT (4)
  • SQLITE_AUTH (23)
  • SQLITE_BUSY (5)
  • SQLITE_CANTOPEN (14)
  • SQLITE_CONSTRAINT (19)
  • SQLITE_CORRUPT (11)
  • SQLITE_DONE (101)
  • SQLITE_EMPTY (16)
  • SQLITE_ERROR (1)
  • SQLITE_FORMAT (24)
  • SQLITE_FULL (13)
  • SQLITE_INTERNAL (2)
  • SQLITE_INTERRUPT (9)
  • SQLITE_IOERR (10)
  • SQLITE_LOCKED (6)
  • SQLITE_MISMATCH (20)
  • SQLITE_MISUSE (21)
  • SQLITE_NOLFS (22)
  • SQLITE_NOMEM (7)
  • SQLITE_NOTADB (26)
  • SQLITE_NOTFOUND (12)
  • SQLITE_NOTICE (27)
  • SQLITE_OK (0)
  • SQLITE_PERM (3)
  • SQLITE_PROTOCOL (15)
  • SQLITE_RANGE (25)
  • SQLITE_READONLY (8)
  • SQLITE_ROW (100)
  • SQLITE_SCHEMA (17)
  • SQLITE_TOOBIG (18)
  • SQLITE_WARNING (28)

5.Расширенный список кодов результатов

74 расширенных кода результатов определены в sqlite3.h и перечислены в алфавитном порядке ниже:

  • SQLITE_ABORT_ROLLBACK (516)
  • SQLITE_AUTH_USER (279)
  • SQLITE_BUSY_RECOVERY (261)
  • SQLITE_BUSY_SNAPSHOT (517)
  • SQLITE_BUSY_TIMEOUT (773)
  • SQLITE_CANTOPEN_CONVPATH (1038)
  • SQLITE_CANTOPEN_DIRTYWAL (1294)
  • SQLITE_CANTOPEN_FULLPATH (782)
  • SQLITE_CANTOPEN_ISDIR (526)
  • SQLITE_CANTOPEN_NOTEMPDIR (270)
  • SQLITE_CANTOPEN_SYMLINK (1550)
  • SQLITE_CONSTRAINT_CHECK (275)
  • SQLITE_CONSTRAINT_COMMITHOOK (531)
  • SQLITE_CONSTRAINT_DATATYPE (3091)
  • SQLITE_CONSTRAINT_FOREIGNKEY (787)
  • SQLITE_CONSTRAINT_FUNCTION (1043)
  • SQLITE_CONSTRAINT_NOTNULL (1299)
  • SQLITE_CONSTRAINT_PINNED (2835)
  • SQLITE_CONSTRAINT_PRIMARYKEY (1555)
  • SQLITE_CONSTRAINT_ROWID (2579)
  • SQLITE_CONSTRAINT_TRIGGER (1811)
  • SQLITE_CONSTRAINT_UNIQUE (2067)
  • SQLITE_CONSTRAINT_VTAB (2323)
  • SQLITE_CORRUPT_INDEX (779)
  • SQLITE_CORRUPT_SEQUENCE (523)
  • SQLITE_CORRUPT_VTAB (267)
  • SQLITE_ERROR_MISSING_COLLSEQ (257)
  • SQLITE_ERROR_RETRY (513)
  • SQLITE_ERROR_SNAPSHOT (769)
  • SQLITE_IOERR_ACCESS (3338)
  • SQLITE_IOERR_AUTH (7178)
  • SQLITE_IOERR_BEGIN_ATOMIC (7434)
  • SQLITE_IOERR_BLOCKED (2826)
  • SQLITE_IOERR_CHECKRESERVEDLOCK (3594)
  • SQLITE_IOERR_CLOSE (4106)
  • SQLITE_IOERR_COMMIT_ATOMIC (7690)
  • SQLITE_IOERR_CONVPATH (6666)
  • SQLITE_IOERR_CORRUPTFS (8458)
  • SQLITE_IOERR_DATA (8202)
  • SQLITE_IOERR_DELETE (2570)
  • SQLITE_IOERR_DELETE_NOENT (5898)
  • SQLITE_IOERR_DIR_CLOSE (4362)
  • SQLITE_IOERR_DIR_FSYNC (1290)
  • SQLITE_IOERR_FSTAT (1802)
  • SQLITE_IOERR_FSYNC (1034)
  • SQLITE_IOERR_GETTEMPPATH (6410)
  • SQLITE_IOERR_LOCK (3850)
  • SQLITE_IOERR_MMAP (6154)
  • SQLITE_IOERR_NOMEM (3082)
  • SQLITE_IOERR_RDLOCK (2314)
  • SQLITE_IOERR_READ (266)
  • SQLITE_IOERR_ROLLBACK_ATOMIC (7946)
  • SQLITE_IOERR_SEEK (5642)
  • SQLITE_IOERR_SHMLOCK (5130)
  • SQLITE_IOERR_SHMMAP (5386)
  • SQLITE_IOERR_SHMOPEN (4618)
  • SQLITE_IOERR_SHMSIZE (4874)
  • SQLITE_IOERR_SHORT_READ (522)
  • SQLITE_IOERR_TRUNCATE (1546)
  • SQLITE_IOERR_UNLOCK (2058)
  • SQLITE_IOERR_VNODE (6922)
  • SQLITE_IOERR_WRITE (778)
  • SQLITE_LOCKED_SHAREDCACHE (262)
  • SQLITE_LOCKED_VTAB (518)
  • SQLITE_NOTICE_RECOVER_ROLLBACK (539)
  • SQLITE_NOTICE_RECOVER_WAL (283)
  • SQLITE_OK_LOAD_PERMANENTLY (256)
  • SQLITE_READONLY_CANTINIT (1288)
  • SQLITE_READONLY_CANTLOCK (520)
  • SQLITE_READONLY_DBMOVED (1032)
  • SQLITE_READONLY_DIRECTORY (1544)
  • SQLITE_READONLY_RECOVERY (264)
  • SQLITE_READONLY_ROLLBACK (776)
  • SQLITE_WARNING_AUTOINDEX (284)

6.Значения кода результата

Значения всех 105 значений кода результата показаны ниже в цифровом порядке.

(0) SQLITE_OK

Код результата SQLITE_OK означает,что операция прошла успешно и ошибок не было.Большинство других кодов результатов указывают на ошибку.

(1) SQLITE_ERROR

Код результата SQLITE_ERROR является общим кодом ошибки,который используется,когда нет другого более специфического кода ошибки.

(2) SQLITE_INTERNAL

Код результата SQLITE_INTERNAL указывает на внутреннюю неисправность.В рабочей версии SQLite приложение никогда не должно видеть такой код результата.Если приложение все же столкнется с таким кодом результата,это свидетельствует о наличии ошибки в движке БД.

SQLite в настоящее время не генерирует этот код результата. Однако определяемые приложением функции SQL или виртуальные таблицы , виртуальные файловые системы или другие расширения могут вызывать возврат этого кода результата.

(3) SQLITE_PERM

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

(4) SQLITE_ABORT

Код результата SQLITE_ABORT указывает, что операция была прервана до завершения, обычно это запрос приложения. См. Также: SQLITE_INTERRUPT .

Если функция обратного вызова sqlite3_exec () возвращает ненулевое значение, тогда sqlite3_exec () вернет SQLITE_ABORT.

Если операция ROLLBACK происходит в том же соединении с базой данных, что и ожидающее чтение или запись, то ожидающее чтение или запись может завершиться ошибкой SQLITE_ABORT или SQLITE_ABORT_ROLLBACK .

Помимо того, что это код результата, значение SQLITE_ABORT также используется в качестве режима разрешения конфликтов, возвращаемого интерфейсом sqlite3_vtab_on_conflict () .

(5) SQLITE_BUSY

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

Например, если процесс A находится в середине большой транзакции записи и в то же время процесс B пытается начать новую транзакцию записи, процесс B вернет результат SQLITE_BUSY, потому что SQLite поддерживает только одну запись за раз. Процессу B нужно будет дождаться, пока процесс A завершит свою транзакцию, прежде чем начинать новую транзакцию. Интерфейсы sqlite3_busy_timeout () и sqlite3_busy_handler () и прагма busy_timeout доступны для процесса B, чтобы помочь ему справиться с ошибками SQLITE_BUSY.

Ошибка SQLITE_BUSY может возникнуть в любой момент транзакции: при первом запуске транзакции, во время любых операций записи или обновления или при фиксации транзакции. Чтобы избежать ошибок SQLITE_BUSY в середине транзакции, приложение может использовать BEGIN IMMEDIATE вместо просто BEGIN для запуска транзакции. Команда BEGIN IMMEDIATE может сама вернуть SQLITE_BUSY, но в случае успеха SQLite гарантирует, что никакие последующие операции с той же базой данных через следующую COMMIT не вернут SQLITE_BUSY.

См. Также: SQLITE_BUSY_RECOVERY и SQLITE_BUSY_SNAPSHOT .

Код результата SQLITE_BUSY отличается от SQLITE_LOCKED тем, что SQLITE_BUSY указывает на конфликт с отдельным соединением с базой данных , вероятно, в отдельном процессе, тогда как SQLITE_LOCKED указывает на конфликт внутри того же соединения с базой данных (или иногда соединения с базой данных с общим кешем ).

(6) SQLITE_LOCKED

Код результата SQLITE_LOCKED указывает, что операция записи не может быть продолжена из-за конфликта внутри того же соединения с базой данных или конфликта с другим соединением с базой данных, которое использует общий кэш .

Например, оператор DROP TABLE не может быть запущен, пока другой поток читает из этой таблицы в том же соединении с базой данных, потому что при удалении таблицы таблица будет удалена из-под одновременного чтения.

Код результата SQLITE_LOCKED отличается от SQLITE_BUSY тем, что SQLITE_LOCKED указывает на конфликт в одном и том же соединении с базой данных (или в соединении с общим кешем ), тогда как SQLITE_BUSY указывает на конфликт с другим соединением с базой данных, возможно, в другом процессе.

(7) SQLITE_NOMEM

Код результата SQLITE_NOMEM указывает, что SQLite не смог выделить всю память, необходимую для завершения операции. Другими словами, внутренний вызов sqlite3_malloc () или sqlite3_realloc () завершился неудачно в случае, когда выделенная память требовалась для продолжения операции.

(8) SQLITE_READONLY

Код результата SQLITE_READONLY возвращается при попытке изменить некоторые данные,на которые текущее подключение к БД не имеет права записи.

(9) SQLITE_INTERRUPT

Код результата SQLITE_INTERRUPT указывает, что операция была прервана интерфейсом sqlite3_interrupt () . См. Также: SQLITE_ABORT

(10) SQLITE_IOERR

Код результата SQLITE_IOERR говорит,что операция не может быть завершена,так как операционная система сообщает об ошибке ввода/вывода.

Полный диск обычно дает ошибку SQLITE_FULL, а не ошибку SQLITE_IOERR.

Существует много различных расширенных кодов результатов для ошибок ввода/вывода,которые идентифицируют конкретную операцию ввода/вывода,которая не удалась.

(11) SQLITE_CORRUPT

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

(12) SQLITE_NOTFOUND

Код результата SQLITE_NOTFOUND раскрывается тремя способами:

  1. SQLITE_NOTFOUND может быть возвращен интерфейсом sqlite3_file_control() , чтобы указать, что код операции управления файлом, переданный в качестве третьего аргумента, не был распознан базовой VFS .

  2. SQLITE_NOTFOUND также может быть возвращен методом xSetSystemCall() объекта sqlite3_vfs .

  3. SQLITE_NOTFOUND возвращается функцией sqlite3_vtab_rhs_value() , чтобы указать, что правый операнд ограничения недоступен для метода xBestIndex , выполнившего вызов.

Код результата SQLITE_NOTFOUND также используется внутри реализации SQLite,но эти внутренние использования не подвержены приложению.

(13) SQLITE_FULL

Код результата SQLITE_FULL указывает, что запись не может быть завершена из-за переполнения диска. Обратите внимание, что эта ошибка может возникнуть при попытке записать информацию в основной файл базы данных или при записи во временные файлы на диске .

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

(14) SQLITE_CANTOPEN

Код результата SQLITE_CANTOPEN указывает, что SQLite не удалось открыть файл. Рассматриваемый файл может быть основным файлом базы данных или одним из нескольких временных файлов на диске .

(15) SQLITE_PROTOCOL

Код результата SQLITE_PROTOCOL указывает на проблему с протоколом блокировки файлов, используемым SQLite. Ошибка SQLITE_PROTOCOL в настоящее время возвращается только при использовании режима WAL и попытке начать новую транзакцию. Когда два отдельных соединения с базой данных одновременно пытаются запустить транзакцию в режиме WAL, возникает состояние гонки . Проигравший в гонке отступает и пытается снова после небольшой задержки. Если одно и то же соединение десятки раз проигрывает в гонке блокировок в течение нескольких секунд, оно в конечном итоге завершится и вернет SQLITE_PROTOCOL. Ошибка SQLITE_PROTOCOL должна появляться на практике очень, очень редко и только тогда, когда существует множество отдельных процессов, все из которых активно конкурируют за запись в одну и ту же базу данных.

(16) SQLITE_EMPTY

В настоящее время код результата SQLITE_EMPTY не используется.

(17) SQLITE_SCHEMA

Код результата SQLITE_SCHEMA указывает, что схема базы данных изменилась. Этот код результата может быть возвращен из sqlite3_step () для подготовленного оператора, который был сгенерирован с помощью sqlite3_prepare () или sqlite3_prepare16 () . Если схема базы данных была изменена каким-то другим процессом между временем подготовки оператора и временем его выполнения, может возникнуть эта ошибка.

Если подготовленный оператор генерируется из sqlite3_prepare_v2() , то он автоматически повторно подготавливается при изменении схемы до SQLITE_MAX_SCHEMA_RETRY раз (по умолчанию: 50). Интерфейс sqlite3_step() вернет SQLITE_SCHEMA обратно в приложение только в том случае, если сбой сохраняется после этих многочисленных попыток.

(18) SQLITE_TOOBIG

Код ошибки SQLITE_TOOBIG указывает, что строка или большой двоичный объект слишком велики. По умолчанию максимальная длина строки или большого двоичного объекта в SQLite составляет 1 000 000 000 байт. Эту максимальную длину можно изменить во время компиляции с помощью параметра времени компиляции SQLITE_MAX_LENGTH или во время выполнения с помощью интерфейса sqlite3_limit (db, SQLITE_LIMIT_LENGTH , …). Ошибка SQLITE_TOOBIG возникает, когда SQLite встречает строку или большой двоичный объект, превышающий предел времени компиляции или времени выполнения.

Код ошибки SQLITE_TOOBIG также может появиться, когда оператор SQL слишком большого размера передается в один из интерфейсов sqlite3_prepare_v2() . Максимальная длина оператора SQL по умолчанию составляет гораздо меньшее значение, равное 1 000 000 000 байт. Максимальная длина оператора SQL может быть установлена ​​во время компиляции с помощью SQLITE_MAX_SQL_LENGTH или во время выполнения с помощью sqlite3_limit (db, SQLITE_LIMIT_SQL_LENGTH ,…).

(19) SQLITE_CONSTRAINT

Код ошибки SQLITE_CONSTRAINT означает, что при попытке обработать оператор SQL произошло нарушение ограничения SQL. Дополнительную информацию о неудавшемся ограничении можно найти, просмотрев сопроводительное сообщение об ошибке (возвращаемое через sqlite3_errmsg () или sqlite3_errmsg16 () ) или просмотрев расширенный код ошибки .

Код SQLITE_CONSTRAINT также можно использовать в качестве возвращаемого значения из метода xBestIndex() реализации виртуальной таблицы . Когда xBestIndex() возвращает SQLITE_CONSTRAINT, это указывает на то, что конкретная комбинация входных данных, отправленных в xBestIndex(), не может привести к пригодному для использования плану запроса и не должна подвергаться дальнейшему рассмотрению.

(20) SQLITE_MISMATCH

Код ошибки SQLITE_MISMATCH указывает на несовпадение типа данных.

SQLite,как правило,очень забывает о несоответствиях между типом значения и объявленным типом контейнера,в котором это значение должно храниться.Например,SQLite позволяет приложению хранить большой BLOB в столбце с объявленным типом BOOLEAN.Но в некоторых случаях SQLite строго относится к типам.Ошибка SQLITE_MISMATCH возвращается в тех немногих случаях,когда типы не совпадают.

Идентификатор строки таблицы должен быть целым числом. Попытка установить для rowid значение, отличное от целого (или NULL, которое будет автоматически преобразовано в следующий доступный целочисленный rowid), приводит к ошибке SQLITE_MISMATCH.

(21) SQLITE_MISUSE

Код возврата SQLITE_MISUSE может быть возвращен, если приложение использует какой-либо интерфейс SQLite способом, который не определен или не поддерживается. Например, использование подготовленного оператора после того, как этот подготовленный оператор был завершен, может привести к ошибке SQLITE_MISUSE.

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

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

(22) SQLITE_NOLFS

Ошибка SQLITE_NOLFS может быть возвращена на системах,которые не поддерживают большие файлы,когда база данных становится больше,чем та,с которой может справиться файловая система.»NOLFS» означает «NO Large File Support».

(23) SQLITE_AUTH

Ошибка SQLITE_AUTH возвращается, когда обратный вызов авторизатора указывает, что подготавливаемый оператор SQL не авторизован.

(24) SQLITE_FORMAT

Код ошибки SQLITE_FORMAT в настоящее время не используется SQLite.

(25) SQLITE_RANGE

Ошибка SQLITE_RANGE указывает на то, что аргумент номера параметра для одной из подпрограмм sqlite3_bind или номер столбца в одной из подпрограмм sqlite3_column находится вне допустимого диапазона.

(26) SQLITE_NOTADB

При попытке открыть файл ошибка SQLITE_NOTADB указывает на то,что открываемый файл не является файлом базы данных SQLite.

(27) SQLITE_NOTICE

Код результата SQLITE_NOTICE не возвращается ни одним интерфейсом C / C ++. Однако SQLITE_NOTICE (или, скорее, один из его расширенных кодов ошибок ) иногда используется в качестве первого аргумента в обратном вызове sqlite3_log (), чтобы указать, что происходит необычная операция.

(28) SQLITE_WARNING

Код результата SQLITE_WARNING не возвращается ни одним интерфейсом C / C ++. Однако SQLITE_WARNING (или, скорее, один из его расширенных кодов ошибок ) иногда используется в качестве первого аргумента в обратном вызове sqlite3_log (), чтобы указать, что имеет место необычная и, возможно, непродуманная операция.

(100) SQLITE_ROW

Код результата SQLITE_ROW, возвращаемый sqlite3_step (), указывает, что доступна другая строка вывода.

(101) SQLITE_DONE

Код результата SQLITE_DONE указывает, что операция завершена. Код результата SQLITE_DONE чаще всего рассматривается как возвращаемое значение от sqlite3_step (), указывающее, что оператор SQL выполнен до конца. Но SQLITE_DONE также может возвращаться другими многоступенчатыми интерфейсами, такими как sqlite3_backup_step () .

(256) SQLITE_OK_LOAD_PERMANENTLY

Интерфейс sqlite3_load_extension () загружает расширение в одно соединение с базой данных. По умолчанию это расширение автоматически выгружается при закрытии соединения с базой данных. Однако, если точка входа расширения возвращает SQLITE_OK_LOAD_PERMANENTLY вместо SQLITE_OK, тогда расширение остается загруженным в адресное пространство процесса после закрытия соединения с базой данных. Другими словами, методы xDlClose объекта sqlite3_vfs не вызываются для расширения при закрытии соединения с базой данных.

Код возврата SQLITE_OK_LOAD_PERMANENTLY полезен, например, для загружаемых расширений, которые регистрируют новые VFS .

(257) SQLITE_ERROR_MISSING_COLLSEQ

Код результата SQLITE_ERROR_MISSING_COLLSEQ означает,что SQL-оператор не может быть подготовлен из-за того,что не может быть найдена коллекционная последовательность,названная в этом SQL-операторе.

Иногда, когда встречается этот код ошибки, процедура sqlite3_prepare_v2 () преобразует ошибку в SQLITE_ERROR_RETRY и снова пытается подготовить оператор SQL, используя другой план запроса, который не требует использования неизвестной последовательности сортировки.

(261) SQLITE_BUSY_RECOVERY

Код ошибки SQLITE_BUSY_RECOVERY — это расширенный код ошибки для SQLITE_BUSY, который указывает, что операция не может быть продолжена, поскольку другой процесс занят восстановлением файла базы данных в режиме WAL после сбоя. Код ошибки SQLITE_BUSY_RECOVERY возникает только в базах данных в режиме WAL .

(262) SQLITE_LOCKED_SHAREDCACHE

Код результата SQLITE_LOCKED_SHAREDCACHE указывает, что доступ к записи данных SQLite заблокирован другим соединением с базой данных, которое использует ту же запись в режиме общего кэша . Когда два или более соединения с базой данных используют один и тот же кеш, и одно из соединений находится в процессе изменения записи в этом кэше, тогда другим соединениям блокируется доступ к этим данным, пока изменения продолжаются, чтобы предотвратить доступ читателей. увидеть поврежденное или частично завершенное изменение.

(264) SQLITE_READONLY_RECOVERY

Код ошибки SQLITE_READONLY_RECOVERY — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_RECOVERY указывает, что база данных в режиме WAL не может быть открыта, потому что файл базы данных необходимо восстановить, а для восстановления требуется доступ для записи, но доступен только доступ для чтения.

(266) SQLITE_IOERR_READ

Код ошибки SQLITE_IOERR_READ — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке чтения из файла на диске. Эта ошибка может возникнуть из-за неисправности оборудования или из-за того, что файловая система была отключена, пока файл был открыт.

(267) SQLITE_CORRUPT_VTAB

Код ошибки SQLITE_CORRUPT_VTAB — это расширенный код ошибки для SQLITE_CORRUPT, используемый виртуальными таблицами . Виртуальная таблица может вернуться SQLITE_CORRUPT_VTAB , чтобы указать , что содержание в виртуальной таблице повреждено.

(270) SQLITE_CANTOPEN_NOTEMPDIR

Код ошибки SQLITE_CANTOPEN_NOTEMPDIR больше не используется.

(275) SQLITE_CONSTRAINT_CHECK

Код ошибки SQLITE_CONSTRAINT_CHECK — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения CHECK .

(279) SQLITE_AUTH_USER

Код ошибки SQLITE_AUTH_USER — это расширенный код ошибки для SQLITE_AUTH , указывающий, что была предпринята операция в базе данных, для которой вошедший в систему пользователь не имеет достаточной авторизации.

(283) SQLITE_NOTICE_RECOVER_WAL

Код результата SQLITE_NOTICE_RECOVER_WAL передается в обратный вызов sqlite3_log () при восстановлении файла базы данных в режиме WAL .

(284) SQLITE_WARNING_AUTOINDEX

Код результата SQLITE_WARNING_AUTOINDEX передается в обратный вызов sqlite3_log () всякий раз, когда используется автоматическое индексирование . Это может служить предупреждением для разработчиков приложений о том, что для базы данных могут быть полезны дополнительные индексы.

(513) SQLITE_ERROR_RETRY

SQLITE_ERROR_RETRY используется внутренне, чтобы спровоцировать sqlite3_prepare_v2 () (или одну из его родственных подпрограмм для создания подготовленных операторов) на повторную попытку подготовить оператор, который завершился неудачно с ошибкой при предыдущей попытке.

(516) SQLITE_ABORT_ROLLBACK

Код ошибки SQLITE_ABORT_ROLLBACK — это расширенный код ошибки для SQLITE_ABORT, указывающий на то, что выполнение инструкции SQL было прервано из- за отката транзакции, которая была активной при первом запуске инструкции SQL. При откате отложенные операции записи всегда завершаются сбоем с этой ошибкой. ОТКАТА вызовет отложенное чтение не выполняется операция , только если схема была изменена в пределах сделки будет произведен откатом.

(517) SQLITE_BUSY_SNAPSHOT

Код ошибки SQLITE_BUSY_SNAPSHOT — это расширенный код ошибки для SQLITE_BUSY, который возникает в базах данных в режиме WAL, когда соединение с базой данных пытается преобразовать транзакцию чтения в транзакцию записи, но обнаруживает, что другое соединение с базой данных уже записано в базу данных и, таким образом, делает недействительными предыдущие чтения.

Следующий сценарий иллюстрирует,как может возникнуть ошибка SQLITE_BUSY_SNAPSHOT:

  1. Процесс A запускает прочитанную транзакцию по базе данных и выполняет один или несколько SELECT-запросов.Процесс A держит транзакцию открытой.
  2. Процесс B обновляет базу данных,изменяя значения,ранее прочитанные процессом A.
  3. Процесс A теперь пытается записать в базу данных.Но представление процесса A о содержимом базы данных теперь устарело,потому что процесс B изменил файл базы данных после того,как процесс A прочитал из него.Поэтому процесс A получает ошибку SQLITE_BUSY_SNAPSHOT.
(518) SQLITE_LOCKED_VTAB

Код результата SQLITE_LOCKED_VTAB не используется ядром SQLite,но доступен для использования расширениями.Реализации виртуальных таблиц могут возвращать этот код результата,чтобы показать,что они не могут завершить текущую операцию из-за блокировок,удерживаемых другими потоками или процессами.

Расширение R-Tree возвращает этот код результата, когда делается попытка обновить R-Tree, когда другой подготовленный оператор активно читает R-Tree. Обновление не может быть продолжено, потому что любое изменение R-дерева может включать перестановку и перебалансировку узлов, что нарушит работу курсоров чтения, в результате чего некоторые строки будут повторяться, а другие строки будут пропущены.

(520) SQLITE_READONLY_CANTLOCK

Код ошибки SQLITE_READONLY_CANTLOCK — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_CANTLOCK указывает, что SQLite не может получить блокировку чтения для базы данных в режиме WAL, поскольку файл с общей памятью, связанный с этой базой данных, доступен только для чтения.

(522) SQLITE_IOERR_SHORT_READ

Код ошибки SQLITE_IOERR_SHORT_READ — это расширенный код ошибки для SQLITE_IOERR, указывающий, что при попытке чтения на уровне VFS не удалось получить столько байтов, сколько было запрошено. Это могло произойти из-за обрезанного файла.

(523) SQLITE_CORRUPT_SEQUENCE

Код результата SQLITE_CORRUPT_SEQUENCE означает, что схема таблицы sqlite_sequence повреждена. Таблица sqlite_sequence используется для помощи в реализации функции AUTOINCREMENT . Таблица sqlite_sequence должна иметь следующий формат:

  CREATE TABLE sqlite_sequence(name,seq);
  

Если SQLite обнаруживает,что таблица sqlite_sequence имеет другой формат,он возвращает ошибку SQLITE_CORRUPT_SEQUENCE.

(526) SQLITE_CANTOPEN_ISDIR

Код ошибки SQLITE_CANTOPEN_ISDIR — это расширенный код ошибки для SQLITE_CANTOPEN, указывающий, что операция открытия файла не удалась, поскольку файл действительно является каталогом.

(531) SQLITE_CONSTRAINT_COMMITHOOK

Код ошибки SQLITE_CONSTRAINT_COMMITHOOK — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что обратный вызов ловушки фиксации вернул ненулевое значение, что, таким образом, вызвало откат оператора SQL.

(539) SQLITE_NOTICE_RECOVER_ROLLBACK

Код результата SQLITE_NOTICE_RECOVER_ROLLBACK передается в обратный вызов sqlite3_log () при откате горячего журнала .

(769) SQLITE_ERROR_SNAPSHOT

Код результата SQLITE_ERROR_SNAPSHOT может быть возвращен при попытке начать транзакцию чтения в исторической версии базы данных с помощью интерфейса sqlite3_snapshot_open() . Если исторический моментальный снимок больше недоступен, транзакция чтения завершится с ошибкой SQLITE_ERROR_SNAPSHOT. Этот код ошибки возможен только в том случае, если SQLite скомпилирован с параметром -DSQLITE_ENABLE_SNAPSHOT .

(773) SQLITE_BUSY_TIMEOUT

Код ошибки SQLITE_BUSY_TIMEOUT указывает на то,что запрос блокировки Posix advisory file lock на уровне VFS не прошел из-за таймаута.Блокирующие консультативные блокировки Posix доступны только как собственное расширение SQLite,и даже тогда они поддерживаются только в том случае,если SQLite скомпилирован с опцией времени компиляции SQLITE_EANBLE_SETLK_TIMEOUT.

(776) SQLITE_READONLY_ROLLBACK

Код ошибки SQLITE_READONLY_ROLLBACK — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_ROLLBACK указывает на то, что базу данных нельзя открыть, потому что у нее есть горячий журнал, который необходимо откатить, но не может, потому что база данных доступна только для чтения.

(778) SQLITE_IOERR_WRITE

Код ошибки SQLITE_IOERR_WRITE — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке записи в файл на диске. Эта ошибка может возникнуть из-за неисправности оборудования или из-за того, что файловая система была отключена, пока файл был открыт. Эта ошибка не должна возникать, если файловая система заполнена, поскольку для этой цели существует отдельный код ошибки (SQLITE_FULL).

(779) SQLITE_CORRUPT_INDEX

Код результата SQLITE_CORRUPT_INDEX означает, что SQLite обнаружил, что запись отсутствует или отсутствует в индексе. Это особый случай кода ошибки SQLITE_CORRUPT, который предполагает, что проблема может быть решена с помощью команды REINDEX , при условии, что в другом месте файла базы данных нет других проблем.

(782) SQLITE_CANTOPEN_FULLPATH

Код ошибки SQLITE_CANTOPEN_FULLPATH — это расширенный код ошибки для SQLITE_CANTOPEN, указывающий на то, что операция открытия файла не удалась, поскольку операционная система не смогла преобразовать имя файла в полный путь.

(787) SQLITE_CONSTRAINT_FOREIGNKEY

Код ошибки SQLITE_CONSTRAINT_FOREIGNKEY — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения внешнего ключа .

(1032) SQLITE_READONLY_DBMOVED

Код ошибки SQLITE_READONLY_DBMOVED — это расширенный код ошибки для SQLITE_READONLY . Код ошибки SQLITE_READONLY_DBMOVED указывает, что база данных не может быть изменена, потому что файл базы данных был перемещен с момента его открытия, и поэтому любая попытка изменения базы данных может привести к повреждению базы данных, если процессы выйдут из строя из-за неправильного имени журнала отката .

(1034) SQLITE_IOERR_FSYNC

Код ошибки SQLITE_IOERR_FSYNC — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке сбросить ранее записанный контент из буферов ОС и / или управления диском в постоянное хранилище. Другими словами, этот код указывает на проблему с системным вызовом fsync () в unix или системным вызовом FlushFileBuffers () в Windows.

(1038) SQLITE_CANTOPEN_CONVPATH

Код ошибки SQLITE_CANTOPEN_CONVPATH — это расширенный код ошибки для SQLITE_CANTOPEN, используемый только Cygwin VFS и указывающий на то, что системный вызов cygwin_conv_path () завершился неудачно при попытке открыть файл. См. Также: SQLITE_IOERR_CONVPATH

(1043) SQLITE_CONSTRAINT_FUNCTION

Код ошибки SQLITE_CONSTRAINT_FUNCTION в настоящее время не используется ядром SQLite.Однако этот код ошибки доступен для использования функциями расширения.

(1288) SQLITE_READONLY_CANTINIT

Код результата SQLITE_READONLY_CANTINIT берет начало в методе xShmMap VFS, чтобы указать, что область разделяемой памяти, используемая режимом WAL, существует, но ее содержимое ненадежно и непригодно для использования текущим процессом, поскольку текущий процесс не имеет разрешения на запись в область разделяемой памяти. (Область общей памяти для режима WAL обычно представляет собой файл с суффиксом «-wal», который отображается в пространстве процесса. Если текущий процесс не имеет разрешения на запись в этот файл, он не может записывать в общую память.)

Логика более высокого уровня внутри SQLite,как правило,перехватывает код ошибки и создает временную область общей памяти in-memory,так что текущий процесс может,по крайней мере,читать содержимое базы данных.Этот код результата не должен доходить до уровня интерфейса приложения.

(1290) SQLITE_IOERR_DIR_FSYNC

Код ошибки SQLITE_IOERR_DIR_FSYNC — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке вызвать fsync () в каталоге. Unix VFS пытается открыть каталоги fsync () после создания или удаления определенных файлов, чтобы гарантировать, что эти файлы по-прежнему будут отображаться в файловой системе после отключения питания или сбоя системы. Этот код ошибки указывает на проблему при попытке выполнить эту fsync ().

(1294) SQLITE_CANTOPEN_DIRTYWAL

В настоящее время код результата SQLITE_CANTOPEN_DIRTYWAL не используется.

(1299) SQLITE_CONSTRAINT_NOTNULL

Код ошибки SQLITE_CONSTRAINT_NOTNULL — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения NOT NULL .

(1544) SQLITE_READONLY_DIRECTORY

Код результата SQLITE_READONLY_DIRECTORY указывает на то,что БД доступна только для чтения,так как процесс не имеет права создавать файл журнала в том же каталоге,что и БД,и создание файла журнала является обязательным условием для записи.

(1546) SQLITE_IOERR_TRUNCATE

Код ошибки SQLITE_IOERR_TRUNCATE — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке усечь файл до меньшего размера.

(1550) SQLITE_CANTOPEN_SYMLINK

Код результата SQLITE_CANTOPEN_SYMLINK возвращается интерфейсом sqlite3_open () и его родственниками, когда используется флаг SQLITE_OPEN_NOFOLLOW и файл базы данных является символической ссылкой.

(1555) SQLITE_CONSTRAINT_PRIMARYKEY

Код ошибки SQLITE_CONSTRAINT_PRIMARYKEY — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения PRIMARY KEY .

(1802) SQLITE_IOERR_FSTAT

Код ошибки SQLITE_IOERR_FSTAT — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода на уровне VFS при попытке вызвать fstat () (или эквивалент) для файла, чтобы определить такую ​​информацию, как размер файла или права доступа.

(1811) SQLITE_CONSTRAINT_TRIGGER

Код ошибки SQLITE_CONSTRAINT_TRIGGER — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что сработала функция RAISE в триггере , в результате чего оператор SQL был прерван.

(2058) SQLITE_IOERR_UNLOCK

Код ошибки SQLITE_IOERR_UNLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xUnlock объекта sqlite3_io_methods .

(2067) SQLITE_CONSTRAINT_UNIQUE

Код ошибки SQLITE_CONSTRAINT_UNIQUE — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий на сбой ограничения UNIQUE .

(2314) SQLITE_IOERR_RDLOCK

Код ошибки SQLITE_IOERR_UNLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xLock объекта sqlite3_io_methods при попытке получить блокировку чтения.

(2323) SQLITE_CONSTRAINT_VTAB

Код ошибки SQLITE_CONSTRAINT_VTAB в настоящее время не используется ядром SQLite. Однако этот код ошибки доступен для использования виртуальными таблицами, определяемыми приложением .

(2570) SQLITE_IOERR_DELETE

Код ошибки SQLITE_IOERR_UNLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xDelete объекта sqlite3_vfs .

(2579) SQLITE_CONSTRAINT_ROWID

Код ошибки SQLITE_CONSTRAINT_ROWID — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что идентификатор строки не является уникальным.

(2826) SQLITE_IOERR_BLOCKED

Код ошибки SQLITE_IOERR_BLOCKED больше не используется.

(2835) SQLITE_CONSTRAINT_PINNED

Код ошибки SQLITE_CONSTRAINT_PINNED — это расширенный код ошибки для SQLITE_CONSTRAINT, указывающий, что попытка триггера UPDATE удаляет строку, которая обновлялась в середине обновления.

(3082) SQLITE_IOERR_NOMEM

Код ошибки SQLITE_IOERR_NOMEM иногда возвращается уровнем VFS, чтобы указать, что операция не может быть завершена из-за невозможности выделить достаточно памяти. Этот код ошибки обычно преобразуется в SQLITE_NOMEM более высокими уровнями SQLite перед возвратом в приложение.

(3091) SQLITE_CONSTRAINT_DATATYPE

Код ошибки SQLITE_CONSTRAINT_DATATYPE — это расширенный код ошибки для SQLITE_CONSTRAINT , указывающий на попытку вставки или обновления сохранить значение, несовместимое с объявленным типом столбца в таблице, определенной как STRICT.

(3338) SQLITE_IOERR_ACCESS

Код ошибки SQLITE_IOERR_ACCESS — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xAccess объекта sqlite3_vfs .

(3594) SQLITE_IOERR_CHECKRESERVEDLOCK

Код ошибки SQLITE_IOERR_CHECKRESERVEDLOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xCheckReservedLock в объекте sqlite3_io_methods .

(3850) SQLITE_IOERR_LOCK

Код ошибки SQLITE_IOERR_LOCK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в логике блокировки рекомендательного файла. Обычно ошибка SQLITE_IOERR_LOCK указывает на проблему с получением блокировки PENDING . Однако он также может указывать на различные ошибки блокировки на некоторых специализированных VFS, используемых на компьютерах Mac.

(4106) SQLITE_IOERR_CLOSE

Код ошибки SQLITE_IOERR_ACCESS — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xClose объекта sqlite3_io_methods .

(4362) SQLITE_IOERR_DIR_CLOSE

Код ошибки SQLITE_IOERR_DIR_CLOSE больше не используется.

(4618) SQLITE_IOERR_SHMOPEN

Код ошибки SQLITE_IOERR_SHMOPEN — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xShmMap объекта sqlite3_io_methods при попытке открыть новый сегмент разделяемой памяти.

(4874) SQLITE_IOERR_SHMSIZE

Код ошибки SQLITE_IOERR_SHMSIZE — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xShmMap в объекте sqlite3_io_methods при попытке увеличить файл «shm» как часть обработки транзакции в режиме WAL . Эта ошибка может указывать на то, что на томе базовой файловой системы не хватает места.

(5130) SQLITE_IOERR_SHMLOCK

Код ошибки SQLITE_IOERR_SHMLOCK больше не используется.

(5386) SQLITE_IOERR_SHMMAP

Код ошибки SQLITE_IOERR_SHMMAP — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методе xShmMap объекта sqlite3_io_methods при попытке сопоставить сегмент общей памяти в адресное пространство процесса.

(5642) SQLITE_IOERR_SEEK

Код ошибки SQLITE_IOERR_SEEK — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методах xRead или xWrite в объекте sqlite3_io_methods при попытке поиска файлового дескриптора до начальной точки файла, где должно произойти чтение или запись.

(5898) SQLITE_IOERR_DELETE_NOENT

Код ошибки SQLITE_IOERR_DELETE_NOENT — это расширенный код ошибки для SQLITE_IOERR, указывающий, что метод xDelete объекта sqlite3_vfs завершился неудачно, поскольку удаляемый файл не существует.

(6154) SQLITE_IOERR_MMAP

Код ошибки SQLITE_IOERR_MMAP — это расширенный код ошибки для SQLITE_IOERR, указывающий на ошибку ввода-вывода в методах xFetch или xUnfetch объекта sqlite3_io_methods при попытке сопоставить или отменить сопоставление части файла базы данных в адресное пространство процесса.

(6410) SQLITE_IOERR_GETTEMPPATH

Код ошибки SQLITE_IOERR_GETTEMPPATH — это расширенный код ошибки для SQLITE_IOERR, указывающий, что VFS не может определить подходящий каталог для размещения временных файлов.

(6666) SQLITE_IOERR_CONVPATH

Код ошибки SQLITE_IOERR_CONVPATH — это расширенный код ошибки для SQLITE_IOERR, который используется только Cygwin VFS и указывает на сбой системного вызова cygwin_conv_path (). См. Также: SQLITE_CANTOPEN_CONVPATH

(6922) SQLITE_IOERR_VNODE

Код ошибки SQLITE_IOERR_VNODE-это код,зарезервированный для использования расширениями.Он не используется ядром SQLite.

(7178) SQLITE_IOERR_AUTH

Код ошибки SQLITE_IOERR_AUTH-это код,зарезервированный для использования расширениями.Он не используется ядром SQLite.

(7434) SQLITE_IOERR_BEGIN_ATOMIC

Код ошибки SQLITE_IOERR_BEGIN_ATOMIC указывает на то, что базовая операционная система сообщила об ошибке в элементе управления файлами SQLITE_FCNTL_BEGIN_ATOMIC_WRITE . Это происходит только тогда, когда SQLITE_ENABLE_ATOMIC_WRITE включен и база данных размещена в файловой системе, которая поддерживает атомарную запись.

(7690) SQLITE_IOERR_COMMIT_ATOMIC

Код ошибки SQLITE_IOERR_COMMIT_ATOMIC указывает на то, что базовая операционная система сообщила об ошибке в элементе управления файлами SQLITE_FCNTL_COMMIT_ATOMIC_WRITE . Это происходит только тогда, когда SQLITE_ENABLE_ATOMIC_WRITE включен и база данных размещена в файловой системе, которая поддерживает атомарную запись.

(7946) SQLITE_IOERR_ROLLBACK_ATOMIC

Код ошибки SQLITE_IOERR_ROLLBACK_ATOMIC указывает на то, что базовая операционная система сообщила об ошибке в элементе управления файлами SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE . Это происходит только тогда, когда SQLITE_ENABLE_ATOMIC_WRITE включен и база данных размещена в файловой системе, которая поддерживает атомарную запись.

(8202) SQLITE_IOERR_DATA

Код ошибки SQLITE_IOERR_DATA — это расширенный код ошибки для SQLITE_IOERR, используемый только прокладкой контрольной суммы VFS, чтобы указать, что контрольная сумма на странице файла базы данных неверна.

(8458) SQLITE_IOERR_CORRUPTFS

Код ошибки SQLITE_IOERR_CORRUPTFS — это расширенный код ошибки для SQLITE_IOERR, используемый только VFS для указания того, что сбой поиска или чтения произошел из-за того, что запрос не попадает в границы файла, а не из-за обычного сбоя устройства. Это часто указывает на поврежденную файловую систему.


SQLite

3.40

  • Причуды,пещеры и ловушки в SQLite.

    Язык SQL является «стандартным».

  • Расширение RBU

    Расширение RBU-это надстройка для SQLite,предназначенная для использования с большими файлами баз данных маломощных устройств на границе сети.

  • Rowid Tables

    «Таблица rowid» — это любая в схеме SQLite, которую таблицы Rowid отличают тем, что все они используют уникальное, ненулевое, подписанное 64-битное целое число.

  • Row Values

    «Значение» — это одиночное число, строка, BLOB или NULL.

Python uses exceptions to indicate an error has
happened. The SQLite library uses integer error codes. APSW maps between the two
systems as needed. Exceptions raised in Python code called by SQLite
will have that exception present when control returns to Python, and
SQLite will understand that an error occurred.

Unraisable¶

There are a few places where it is not possible for a Python exception
to be reported to SQLite as an error, typically because SQLite does
not allow an error to be signalled in that context. Another example
would be in VFS code, because SQLite takes actions to
recover from errors (eg it may try to rollback a transaction on a
write error). Python wants to return to callers, not continue
execution while the exception is pending. (Also only one exception
can be active at a time.)

Unraisable exceptions in VFS code are handled by calling
VFS.excepthook() or VFSFile.excepthook() (more info). In other code sys.unraisablehook is
called, and if that is not present then sys.excepthook is
called.

sqlite3_log is also called
so that you will have the context of when the exception happened
relative to the errors SQLite is logging.

Exception Classes¶

exception Error

This is the base for APSW exceptions.

Error.result

For exceptions corresponding to SQLite error codes codes this attribute
is the numeric error code.

Error.extendedresult

APSW runs with extended result codes turned on.
This attribute includes the detailed code.

Error.error_offset

The location of the error in the SQL when encoded in UTF-8.
The value is from sqlite3_error_offset.

As an example, if SQLite issued a read request and the system returned
less data than expected then result would have the value
SQLITE_IOERR while extendedresult would have
the value SQLITE_IOERR_SHORT_READ.

APSW specific exceptions¶

The following exceptions happen when APSW detects various problems.

exception ThreadingViolationError

You have used an object concurrently in two threads. For example you
may try to use the same cursor in two different threads at the same
time, or tried to close the same connection in two threads at the
same time.

You can also get this exception by using a cursor as an argument to
itself (eg as the input data for Cursor.executemany()).
Cursors can only be used for one thing at a time.

exception ForkingViolationError

See apsw.fork_checker().

exception IncompleteExecutionError

You have tried to start a new SQL execute call before executing all
the previous ones. See the execution model
for more details.

exception ConnectionNotClosedError

This exception is no longer generated. It was required in earlier
releases due to constraints in threading usage with SQLite.

exception ConnectionClosedError

You have called Connection.close() and then continued to use
the Connection or associated cursors.

exception CursorClosedError

You have called Cursor.close() and then tried to use the cursor.

exception BindingsError

There are several causes for this exception. When using tuples, an incorrect number of bindings where supplied:

cursor.execute("select ?,?,?", (1,2))     # too few bindings
cursor.execute("select ?,?,?", (1,2,3,4)) # too many bindings

You are using named bindings, but not all bindings are named. You should either use entirely the
named style or entirely numeric (unnamed) style:

cursor.execute("select * from foo where x=:name and y=?")

Note

It is not considered an error to have missing keys in a dictionary. For example this is perfectly valid:

cursor.execute("insert into foo values($a,:b,$c)", {'a': 1})

b and c are not in the dict. For missing keys, None/NULL
will be used. This is so you don’t have to add lots of spurious
values to the supplied dict. If your schema requires every column
have a value, then SQLite will generate an error due to some
values being None/NULL so that case will be caught.

exception ExecutionCompleteError

A statement is complete but you try to run it more anyway!

exception ExecTraceAbort

The execution tracer returned False so
execution was aborted.

exception ExtensionLoadingError

An error happened loading an extension.

exception VFSNotImplementedError

A call cannot be made to an inherited Virtual File System (VFS) method as the VFS
does not implement the method.

exception VFSFileClosedError

The VFS file is closed so the operation cannot be performed.

SQLite Exceptions¶

The following lists which Exception classes correspond to which SQLite
error codes.

General Errors¶

exception SQLError

SQLITE_ERROR. This error is documented as a bad SQL query
or missing database, but is also returned for a lot of other
situations. It is the default error code unless there is a more
specific one.

exception MismatchError

SQLITE_MISMATCH. Data type mismatch. For example a rowid
or integer primary key must be an integer.

exception NotFoundError

SQLITE_NOTFOUND. Returned when various internal items were
not found such as requests for non-existent system calls or file
controls.

Internal Errors¶

exception InternalError

SQLITE_INTERNAL. (No longer used) Internal logic error in SQLite.

exception ProtocolError

SQLITE_PROTOCOL. (No longer used) Database lock protocol error.

exception MisuseError

SQLITE_MISUSE. SQLite library used incorrectly — typically similar to ValueError in Python. Examples include not
having enough flags when opening a connection (eg not including a READ or WRITE flag), or out of spec such as registering
a function with more than 127 parameters.

exception RangeError

SQLITE_RANGE. (Cannot be generated using APSW). 2nd parameter to sqlite3_bind out of range

Permissions Etc¶

exception PermissionsError

SQLITE_PERM. Access permission denied by the operating system, or parts of the database are readonly such as a cursor.

exception ReadOnlyError

SQLITE_READONLY. Attempt to write to a readonly database.

exception CantOpenError

SQLITE_CANTOPEN. Unable to open the database file.

exception AuthError

SQLITE_AUTH. Authorization denied.

Abort/Busy Etc¶

exception AbortError

SQLITE_ABORT. Callback routine requested an abort.

exception BusyError

SQLITE_BUSY. The database file is locked. Use
Connection.setbusytimeout() to change how long SQLite waits
for the database to be unlocked or Connection.setbusyhandler()
to use your own handler.

exception LockedError

SQLITE_LOCKED. A table in the database is locked.

exception InterruptError

SQLITE_INTERRUPT. Operation terminated by
sqlite3_interrupt —
use Connection.interrupt().

exception SchemaChangeError

SQLITE_SCHEMA. The database schema changed. A
prepared statement becomes invalid
if the database schema was changed. Behind the scenes SQLite
reprepares the statement. Another or the same Connection
may change the schema again before the statement runs. SQLite will
attempt up to 5 times before giving up and returning this error.

exception ConstraintError

SQLITE_CONSTRAINT. Abort due to constraint violation. This
would happen if the schema required a column to be within a specific
range. If you have multiple constraints, you can’t tell
which one was the cause.

Memory/Disk¶

exception NoMemError

SQLITE_NOMEM. A memory allocation failed.

exception IOError

SQLITE_IOERR. Some kind of disk I/O error occurred. The
extended error code will give more detail.

exception CorruptError

SQLITE_CORRUPT. The database disk image appears to be a
SQLite database but the values inside are inconsistent.

exception FullError

SQLITE_FULL. The disk appears to be full.

exception TooBigError

SQLITE_TOOBIG. String or BLOB exceeds size limit. You can
change the limits using Connection.limit().

exception NoLFSError

SQLITE_NOLFS. SQLite has attempted to use a feature not
supported by the operating system such as large file support.

exception EmptyError

SQLITE_EMPTY. Database is completely empty.

exception FormatError

SQLITE_FORMAT. (No longer used) Auxiliary database format error.

exception NotADBError

SQLITE_NOTADB. File opened that is not a database file.
SQLite has a header on database files to verify they are indeed
SQLite databases.

Augmented stack traces¶

When an exception occurs, Python does not include frames from
non-Python code (ie the C code called from Python). This can make it
more difficult to work out what was going on when an exception
occurred for example when there are callbacks to collations, functions
or virtual tables, triggers firing etc.

This is an example showing the difference between the tracebacks you
would have got with earlier versions of apsw and the augmented
traceback:

import apsw

def myfunc(x):
  1/0

con=apsw.Connection(":memory:")
con.createscalarfunction("foo", myfunc)
con.createscalarfunction("fam", myfunc)
cursor=con.cursor()
cursor.execute("create table bar(x,y,z);insert into bar values(1,2,3)")
cursor.execute("select foo(1) from bar")

Original Traceback

Traceback (most recent call last):
  File "t.py", line 11, in <module>
    cursor.execute("select foo(1) from bar")
  File "t.py", line 4, in myfunc
    1/0
ZeroDivisionError: integer division or modulo by zero

Augmented Traceback

Traceback (most recent call last):
  File "t.py", line 11, in <module>
    cursor.execute("select foo(1) from bar")
  File "apsw.c", line 3412, in resetcursor
  File "apsw.c", line 1597, in user-defined-scalar-foo
  File "t.py", line 4, in myfunc
    1/0
ZeroDivisionError: integer division or modulo by zero

In the original traceback you can’t even see that code in apsw was
involved. The augmented traceback shows that there were indeed two
function calls within apsw and gives you line numbers should you need
to examine the code. Also note how you are told that the call was in
user-defined-scalar-foo (ie you can tell which function was called.)

But wait, there is more!!! In order to further aid troubleshooting,
the augmented stack traces make additional information available. Each
frame in the traceback has local variables defined with more
information. You can use apsw.ext.print_augmented_traceback() to
print an exception with the local variables.

Here is a far more complex example from some virtual tables code I was writing. The BestIndex method in my code
had returned an incorrect value. The augmented traceback includes
local variables. I can see what was passed in to my method, what I
returned and which item was erroneous. The original traceback is
almost completely useless!

Original traceback:

Traceback (most recent call last):
  File "tests.py", line 1387, in testVtables
    cursor.execute(allconstraints)
TypeError: Bad constraint (#2) - it should be one of None, an integer or a tuple of an integer and a boolean

Augmented traceback with local variables:

Traceback (most recent call last):
  File "tests.py", line 1387, in testVtables
    cursor.execute(allconstraints)
                VTable =  __main__.VTable
                   cur =  <apsw.Cursor object at 0x988f30>
                     i =  10
                  self =  testVtables (__main__.APSW)
        allconstraints =  select rowid,* from foo where rowid>-1000 ....

  File "apsw.c", line 4050, in Cursor_execute.sqlite3_prepare
            Connection =  <apsw.Connection object at 0x978800>
             statement =  select rowid,* from foo where rowid>-1000 ....

  File "apsw.c", line 2681, in VirtualTable.xBestIndex
                  self =  <__main__.VTable instance at 0x98d8c0>
                  args =  (((-1, 4), (0, 32), (1, 8), (2, 4), (3, 64)), ((2, False),))
                result =  ([4, (3,), [2, False], [1], [0]], 997, u'xea', False)

  File "apsw.c", line 2559, in VirtualTable.xBestIndex.result_constraint
               indices =  [4, (3,), [2, False], [1], [0]]
                  self =  <__main__.VTable instance at 0x98d8c0>
                result =  ([4, (3,), [2, False], [1], [0]], 997, u'xea', False)
            constraint =  (3,)

TypeError: Bad constraint (#2) - it should be one of None, an integer or a tuple of an integer and a boolean
/*————————————————————————— * Copyright 2009 Taro L. Saito * * Licensed under the Apache License, Version 2.0 (the «License»); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an «AS IS»BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *—————————————————————————*/ // ————————————— // sqlite-jdbc Project // // SQLiteErrorCode.java // Since: Apr 21, 2009 // // $URL$ // $Author$ // ————————————— package org.sqlite; /** * SQLite3 error code * * @author leo * @see <a * href=»https://www.sqlite.org/c3ref/c_abort.html»>https://www.sqlite.org/c3ref/c_abort.html</a> */ public enum SQLiteErrorCode { UNKNOWN_ERROR(-1, «unknown error»), SQLITE_OK(0, «Successful result»), /* beginning-of-error-codes */ SQLITE_ERROR(1, «SQL error or missing database»), SQLITE_INTERNAL(2, «Internal logic error in SQLite»), SQLITE_PERM(3, «Access permission denied»), SQLITE_ABORT(4, «Callback routine requested an abort»), SQLITE_BUSY(5, «The database file is locked»), SQLITE_LOCKED(6, «A table in the database is locked»), SQLITE_NOMEM(7, «A malloc() failed»), SQLITE_READONLY(8, «Attempt to write a readonly database»), SQLITE_INTERRUPT(9, «Operation terminated by sqlite3_interrupt()»), SQLITE_IOERR(10, «Some kind of disk I/O error occurred»), SQLITE_CORRUPT(11, «The database disk image is malformed»), SQLITE_NOTFOUND(12, «NOT USED. Table or record not found»), SQLITE_FULL(13, «Insertion failed because database is full»), SQLITE_CANTOPEN(14, «Unable to open the database file»), SQLITE_PROTOCOL(15, «NOT USED. Database lock protocol error»), SQLITE_EMPTY(16, «Database is empty»), SQLITE_SCHEMA(17, «The database schema changed»), SQLITE_TOOBIG(18, «String or BLOB exceeds size limit»), SQLITE_CONSTRAINT(19, «Abort due to constraint violation»), SQLITE_MISMATCH(20, «Data type mismatch»), SQLITE_MISUSE(21, «Library used incorrectly»), SQLITE_NOLFS(22, «Uses OS features not supported on host»), SQLITE_AUTH(23, «Authorization denied»), SQLITE_FORMAT(24, «Auxiliary database format error»), SQLITE_RANGE(25, «2nd parameter to sqlite3_bind out of range»), SQLITE_NOTADB(26, «File opened that is not a database file»), SQLITE_NOTICE(27, «Notifications from sqlite3_log()»), SQLITE_WARNING(28, «Warnings from sqlite3_log()»), SQLITE_ROW(100, «sqlite3_step() has another row ready»), SQLITE_DONE(101, «sqlite3_step() has finished executing»), /* Beginning of extended error codes */ SQLITE_ABORT_ROLLBACK( 516, «The transaction that was active when the SQL statement first started was rolled back»), SQLITE_AUTH_USER( 279, «An operation was attempted on a database for which the logged in user lacks sufficient authorization»), SQLITE_BUSY_RECOVERY( 261, «Another process is busy recovering a WAL mode database file following a crash»), SQLITE_BUSY_SNAPSHOT(517, «Another database connection has already written to the database»), SQLITE_BUSY_TIMEOUT( 773, «A blocking Posix advisory file lock request in the VFS layer failed due to a timeout»), SQLITE_CANTOPEN_CONVPATH( 1038, «cygwin_conv_path() system call failed while trying to open a file»), SQLITE_CANTOPEN_DIRTYWAL(1294, «Not used»), SQLITE_CANTOPEN_FULLPATH( 782, «The operating system was unable to convert the filename into a full pathname»), SQLITE_CANTOPEN_ISDIR(526, «The file is really a directory»), SQLITE_CANTOPEN_NOTEMPDIR(270, «No longer used»), SQLITE_CANTOPEN_SYMLINK( 1550, «The file is a symbolic link but SQLITE_OPEN_NOFOLLOW flag is used»), SQLITE_CONSTRAINT_CHECK(275, «A CHECK constraint failed»), SQLITE_CONSTRAINT_COMMITHOOK(531, «A commit hook callback returned non-zero»), SQLITE_CONSTRAINT_DATATYPE( 3091, «An insert or update attempted to store a value inconsistent with the column’s declared type in a table defined as STRICT»), SQLITE_CONSTRAINT_FOREIGNKEY(787, «A foreign key constraint failed»), SQLITE_CONSTRAINT_FUNCTION(1043, «Error reported by extension function»), SQLITE_CONSTRAINT_NOTNULL(1299, «A NOT NULL constraint failed»), SQLITE_CONSTRAINT_PINNED( 2835, «An UPDATE trigger attempted to delete the row that was being updated in the middle of the update»), SQLITE_CONSTRAINT_PRIMARYKEY(1555, «A PRIMARY KEY constraint failed»), SQLITE_CONSTRAINT_ROWID(2579, «rowid is not unique»), SQLITE_CONSTRAINT_TRIGGER( 1811, «A RAISE function within a trigger fired, causing the SQL statement to abort»), SQLITE_CONSTRAINT_UNIQUE(2067, «A UNIQUE constraint failed»), SQLITE_CONSTRAINT_VTAB(2323, «Error reported by application-defined virtual table»), SQLITE_CORRUPT_INDEX(779, «SQLite detected an entry is or was missing from an index»), SQLITE_CORRUPT_SEQUENCE(523, «the schema of the sqlite_sequence table is corrupt»), SQLITE_CORRUPT_VTAB(267, «Content in the virtual table is corrupt»), SQLITE_ERROR_MISSING_COLLSEQ( 257, «An SQL statement could not be prepared because a collating sequence named in that SQL statement could not be located»), SQLITE_ERROR_RETRY(513, «used internally»), SQLITE_ERROR_SNAPSHOT(769, «the historical snapshot is no longer available»), SQLITE_IOERR_ACCESS(3338, «I/O error within the xAccess»), SQLITE_IOERR_AUTH(7178, «reserved for use by extensions»), SQLITE_IOERR_BEGIN_ATOMIC( 7434, «the underlying operating system reported and error on the SQLITE_FCNTL_BEGIN_ATOMIC_WRITE file-control»), SQLITE_IOERR_BLOCKED(2826, «no longer used»), SQLITE_IOERR_CHECKRESERVEDLOCK(3594, «I/O error within xCheckReservedLock»), SQLITE_IOERR_CLOSE(4106, «I/O error within xClose»), SQLITE_IOERR_COMMIT_ATOMIC( 7690, «the underlying operating system reported and error on the SQLITE_FCNTL_COMMIT_ATOMIC_WRITE file-control»), SQLITE_IOERR_CONVPATH(6666, «cygwin_conv_path() system call failed»), SQLITE_IOERR_CORRUPTFS( 8458, «I/O error in the VFS layer, a seek or read failure was due to the request not falling within the file’s boundary rather than an ordinary device failure»), SQLITE_IOERR_DATA( 8202, «I/O error in the VFS shim, the checksum on a page of the database file is incorrect»), SQLITE_IOERR_DELETE(2570, «I/O error within xDelete»), SQLITE_IOERR_DELETE_NOENT(5898, «The file being deleted does not exist»), SQLITE_IOERR_DIR_CLOSE(4362, «no longer used»), SQLITE_IOERR_DIR_FSYNC( 1290, «I/O error in the VFS layer while trying to invoke fsync() on a directory»), SQLITE_IOERR_FSTAT(1802, «I/O error in the VFS layer while trying to invoke fstat()»), SQLITE_IOERR_FSYNC( 1034, «I/O error in the VFS layer while trying to flush previously written content»), SQLITE_IOERR_GETTEMPPATH( 6410, «Unable to determine a suitable directory in which to place temporary files»), SQLITE_IOERR_LOCK(3850, «I/O error in the advisory file locking logic»), SQLITE_IOERR_MMAP(6154, «I/O error while trying to map or unmap part of the database file»), SQLITE_IOERR_NOMEM(3082, «Unable to allocate sufficient memory»), SQLITE_IOERR_RDLOCK(2314, «I/O error within xLock»), SQLITE_IOERR_READ(266, «I/O error in the VFS layer while trying to read from a file on disk»), SQLITE_IOERR_ROLLBACK_ATOMIC( 7946, «the underlying operating system reported and error on the SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE file-control»), SQLITE_IOERR_SEEK(5642, «I/O error while trying to seek a file descriptor»), SQLITE_IOERR_SHMLOCK(5130, «no longer used»), SQLITE_IOERR_SHMMAP( 5386, «I/O error within xShmMap while trying to map a shared memory segment»), SQLITE_IOERR_SHMOPEN( 4618, «I/O error within xShmMap while trying to open a new shared memory segment»), SQLITE_IOERR_SHMSIZE( 4874, «I/O error within xShmMap while trying to resize an existing shared memory segment»), SQLITE_IOERR_SHORT_READ( 522, «The VFS layer was unable to obtain as many bytes as was requested»), SQLITE_IOERR_TRUNCATE( 1546, «I/O error in the VFS layer while trying to truncate a file to a smaller size»), SQLITE_IOERR_UNLOCK(2058, «I/O error within xUnlock»), SQLITE_IOERR_VNODE(6922, «reserved for use by extensions»), SQLITE_IOERR_WRITE(778, «I/O error in the VFS layer while trying to write to a file on disk»), SQLITE_LOCKED_SHAREDCACHE( 262, «Contention with a different database connection that shares the cache»), SQLITE_LOCKED_VTAB(518, «reserved for use by extensions»), SQLITE_NOTICE_RECOVER_ROLLBACK(539, «a hot journal is rolled back»), SQLITE_NOTICE_RECOVER_WAL(283, «a WAL mode database file is recovered»), SQLITE_OK_LOAD_PERMANENTLY( 256, «the extension remains loaded into the process address space after the database connection closes»), SQLITE_READONLY_CANTINIT( 1288, «the current process does not have write permission on the shared memory region»), SQLITE_READONLY_CANTLOCK( 520, «The shared-memory file associated with that database is read-only»), SQLITE_READONLY_DBMOVED(1032, «The database file has been moved since it was opened»), SQLITE_READONLY_DIRECTORY( 1544, «Process does not have permission to create a journal file in the same directory as the database and the creation of a journal file is a prerequisite for writing»), SQLITE_READONLY_RECOVERY(264, «The database file needs to be recovered»), SQLITE_READONLY_ROLLBACK(776, «Hot journal needs to be rolled back»), SQLITE_WARNING_AUTOINDEX(284, «automatic indexing is used»); public final int code; public final String message; /** * Constructor that applies error code and message. * * @param code Error code. * @param message Message for the error. */ SQLiteErrorCode(int code, String message) { this.code = code; this.message = message; } /** * @param errorCode Error code. * @return Error message. */ public static SQLiteErrorCode getErrorCode(int errorCode) { for (SQLiteErrorCode each : SQLiteErrorCode.values()) { if (errorCode == each.code) return each; } return UNKNOWN_ERROR; } /** @see java.lang.Enum#toString() */ @Override public String toString() { return String.format(«[%s] %s», this.name(), message); } }

Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07

Стандартный код (StandardCodes

Ниже приведено стандартное возвращаемое значение и определение кода ошибки:

  1. #defineSQLITE_OK0/*Successfulresult*/
  2. /*beginning-of-error-codes*/
  3. #defineSQLITE_ERROR1/*SQLerrorormissingdatabase*/
  4. #defineSQLITE_INTERNAL2/*InternallogicerrorinSQLite*/
  5. #defineSQLITE_PERM3/*Accesspermissiondenied*/
  6. #defineSQLITE_ABORT4/*Callbackroutinerequestedanabort*/
  7. #defineSQLITE_BUSY5/*Thedatabasefileislocked*/
  8. #defineSQLITE_LOCKED6/*Atableinthedatabaseislocked*/
  9. #defineSQLITE_NOMEM7/*Amalloc()failed*/
  10. #defineSQLITE_READONLY8/*Attempttowriteareadonlydatabase*/
  11. #defineSQLITE_INTERRUPT9/*Operationterminatedbysqlite3_interrupt()*/
  12. #defineSQLITE_IOERR10/*SomekindofdiskI/Oerroroccurred*/
  13. #defineSQLITE_CORRUPT11/*Thedatabasediskimageismalformed*/
  14. #defineSQLITE_NOTFOUND12/*Unknownopcodeinsqlite3_file_control()*/
  15. #defineSQLITE_FULL13/*Insertionfailedbecausedatabaseisfull*/
  16. #defineSQLITE_CANTOPEN14/*Unabletoopenthedatabasefile*/
  17. #defineSQLITE_PROTOCOL15/*Databaselockprotocolerror*/
  18. #defineSQLITE_EMPTY16/*Databaseisempty*/
  19. #defineSQLITE_SCHEMA17/*Thedatabaseschemachanged*/
  20. #defineSQLITE_TOOBIG18/*StringorBLOBexceedssizelimit*/
  21. #defineSQLITE_CONSTRAINT19/*Abortduetoconstraintviolation*/
  22. #defineSQLITE_MISMATCH20/*Datatypemismatch*/
  23. #defineSQLITE_MISUSE21/*Libraryusedincorrectly*/
  24. #defineSQLITE_NOLFS22/*UsesOSfeaturesnotsupportedonhost*/
  25. #defineSQLITE_AUTH23/*Authorizationdenied*/
  26. #defineSQLITE_FORMAT24/*Auxiliarydatabaseformaterror*/
  27. #defineSQLITE_RANGE25/*2ndparametertosqlite3_bindoutofrange*/
  28. #defineSQLITE_NOTADB26/*Fileopenedthatisnotadatabasefile*/
  29. #defineSQLITE_ROW100/*sqlite3_step()hasanotherrowready*/
  30. #defineSQLITE_DONE101/*sqlite3_step()hasfinishedexecuting*/
  31. /*end-of-error-codes*/
#define SQLITE_OK           0   /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */
#define SQLITE_PERM         3   /* Access permission denied */
#define SQLITE_ABORT        4   /* Callback routine requested an abort */
#define SQLITE_BUSY         5   /* The database file is locked */
#define SQLITE_LOCKED       6   /* A table in the database is locked */
#define SQLITE_NOMEM        7   /* A malloc() failed */
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL        13   /* Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */
#define SQLITE_EMPTY       16   /* Database is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */
#define SQLITE_MISMATCH    20   /* Data type mismatch */
#define SQLITE_MISUSE      21   /* Library used incorrectly */
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* Authorization denied */
#define SQLITE_FORMAT      24   /* Auxiliary database format error */
#define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB      26   /* File opened that is not a database file */
#define SQLITE_ROW         100  /* sqlite3_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite3_step() has finished executing */
/* end-of-error-codes */

Некоторые из этих констант возвращаются только определенной функцией, такой какSQLITE_RANGEТолькоsqlite3_bind_xxxФункция возвращает. Есть некоторые константы, такие какSQLITE_ERRORЭто может только объяснить, что произошла ошибка во время выполнения функции, но невозможно узнать причину ошибки.

SQLITE_MISUSEОт имениAPIБыл неправильно использован. Например, заявлениеsqlite3_stepПосле выполнения функции и до ее сброса, снова свяжите параметры с ней, в это времяbindФункция вернетсяSQLITE_MISUSE

Код расширения (ExtendedCodes

Стандартный код ошибки предоставляет меньше информации о причине ошибки. Поэтому иногда мы будем использовать расширенные коды ошибок. Расширенный код ошибки основан на стандартном коде ошибки, а его младший байт является исходным стандартным кодом ошибки, а затем дополнительная информация добавляется к старшему байту «или» для описания подробностей ошибки.

  1. intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);

Из-за учета совместимости старых программ заказчика эти расширенные коды ошибок не включены по умолчанию. Программисты могут пройтиsqlite3_extended_result_codesФункция включает или отключает расширенные коды ошибок.

Ниже приведены все расширенные коды ошибок (большинство из которых используются для описанияSQLITE_IOERR):

  1. #defineSQLITE_IOERR_READ(SQLITE_IOERR|(1<<8))
  2. #defineSQLITE_IOERR_SHORT_READ(SQLITE_IOERR|(2<<8))
  3. #defineSQLITE_IOERR_WRITE(SQLITE_IOERR|(3<<8))
  4. #defineSQLITE_IOERR_FSYNC(SQLITE_IOERR|(4<<8))
  5. #defineSQLITE_IOERR_DIR_FSYNC(SQLITE_IOERR|(5<<8))
  6. #defineSQLITE_IOERR_TRUNCATE(SQLITE_IOERR|(6<<8))
  7. #defineSQLITE_IOERR_FSTAT(SQLITE_IOERR|(7<<8))
  8. #defineSQLITE_IOERR_UNLOCK(SQLITE_IOERR|(8<<8))
  9. #defineSQLITE_IOERR_RDLOCK(SQLITE_IOERR|(9<<8))
  10. #defineSQLITE_IOERR_DELETE(SQLITE_IOERR|(10<<8))
  11. #defineSQLITE_IOERR_BLOCKED(SQLITE_IOERR|(11<<8))
  12. #defineSQLITE_IOERR_NOMEM(SQLITE_IOERR|(12<<8))
  13. #defineSQLITE_IOERR_ACCESS(SQLITE_IOERR|(13<<8))
  14. #defineSQLITE_IOERR_CHECKRESERVEDLOCK(SQLITE_IOERR|(14<<8))
  15. #defineSQLITE_IOERR_LOCK(SQLITE_IOERR|(15<<8))
  16. #defineSQLITE_IOERR_CLOSE(SQLITE_IOERR|(16<<8))
  17. #defineSQLITE_IOERR_DIR_CLOSE(SQLITE_IOERR|(17<<8))
  18. #defineSQLITE_IOERR_SHMOPEN(SQLITE_IOERR|(18<<8))
  19. #defineSQLITE_IOERR_SHMSIZE(SQLITE_IOERR|(19<<8))
  20. #defineSQLITE_IOERR_SHMLOCK(SQLITE_IOERR|(20<<8))
  21. #defineSQLITE_IOERR_SHMMAP(SQLITE_IOERR|(21<<8))
  22. #defineSQLITE_IOERR_SEEK(SQLITE_IOERR|(22<<8))
  23. #defineSQLITE_LOCKED_SHAREDCACHE(SQLITE_LOCKED|(1<<8))
  24. #defineSQLITE_BUSY_RECOVERY(SQLITE_BUSY|(1<<8))
  25. #defineSQLITE_CANTOPEN_NOTEMPDIR(SQLITE_CANTOPEN|(1<<8))
  26. #defineSQLITE_CORRUPT_VTAB(SQLITE_CORRUPT|(1<<8))
  27. #defineSQLITE_READONLY_RECOVERY(SQLITE_READONLY|(1<<8))
  28. #defineSQLITE_READONLY_CANTLOCK(SQLITE_READONLY|(2<<8))
#define SQLITE_IOERR_READ              (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ        (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE             (SQLITE_IOERR | (3<<8))
#define SQLITE_IOERR_FSYNC             (SQLITE_IOERR | (4<<8))
#define SQLITE_IOERR_DIR_FSYNC         (SQLITE_IOERR | (5<<8))
#define SQLITE_IOERR_TRUNCATE          (SQLITE_IOERR | (6<<8))
#define SQLITE_IOERR_FSTAT             (SQLITE_IOERR | (7<<8))
#define SQLITE_IOERR_UNLOCK            (SQLITE_IOERR | (8<<8))
#define SQLITE_IOERR_RDLOCK            (SQLITE_IOERR | (9<<8))
#define SQLITE_IOERR_DELETE            (SQLITE_IOERR | (10<<8))
#define SQLITE_IOERR_BLOCKED           (SQLITE_IOERR | (11<<8))
#define SQLITE_IOERR_NOMEM             (SQLITE_IOERR | (12<<8))
#define SQLITE_IOERR_ACCESS            (SQLITE_IOERR | (13<<8))
#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
#define SQLITE_IOERR_LOCK              (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR_CLOSE             (SQLITE_IOERR | (16<<8))
#define SQLITE_IOERR_DIR_CLOSE         (SQLITE_IOERR | (17<<8))
#define SQLITE_IOERR_SHMOPEN           (SQLITE_IOERR | (18<<8))
#define SQLITE_IOERR_SHMSIZE           (SQLITE_IOERR | (19<<8))
#define SQLITE_IOERR_SHMLOCK           (SQLITE_IOERR | (20<<8))
#define SQLITE_IOERR_SHMMAP            (SQLITE_IOERR | (21<<8))
#define SQLITE_IOERR_SEEK              (SQLITE_IOERR | (22<<8))
#define SQLITE_LOCKED_SHAREDCACHE      (SQLITE_LOCKED |  (1<<8))
#define SQLITE_BUSY_RECOVERY           (SQLITE_BUSY   |  (1<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR      (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CORRUPT_VTAB            (SQLITE_CORRUPT | (1<<8))
#define SQLITE_READONLY_RECOVERY       (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK       (SQLITE_READONLY | (2<<8))

ErrorСвязанные функции (ErrorFunctions

  1. intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);

Для подключения к базе данных включите или отключите использование расширенных кодов ошибок. Даваяsqlite3_extended_result_codesПервая функция2Параметры передают ненулевые значения, чтобы включить расширенные коды ошибок. Функция всегда возвращаетSQLITE_OK, Нет способа узнать, включен ли расширенный код ошибки в данный момент.

  1. intsqlite3_errcode(sqlite3*db);
int sqlite3_errcode(sqlite3 *db);

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

  1. intsqlite3_extended_errcode(sqlite3*db);
int sqlite3_extended_errcode(sqlite3 *db);

иsqlite3_errcodeФункция аналогична, за исключением того, что она возвращает только расширенный код ошибки.

  1. constchar*sqlite3_errmsg(sqlite3*);
  2. constvoid*sqlite3_errmsg16(sqlite3*);
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);

Возвращает строку кода ошибки, используйтеUTF-8илиUTF-16Кодирование. Программист должен вызвать эти две функции сразу после получения информации о коде ошибки или сделать копию. Потому что следующая операция с базой данных может привести к тому, что возвращенный указатель на строку будет недействительным.

SQliteОбработка ошибок не может обрабатывать несколько ошибок одновременно, таких какAPIПроизошла ошибка при вызове функции, и программист не проверил ошибку, затем в следующий разAPIВызов функции может вернутьсяSQLITE_MISUSE, Указывая, что программа пыталась использовать недопустимую структуру данных. Так программисты должныAPIПроверьте и обработайте все ошибки, которые могут возникнуть после вызова функции.

Кроме того, если несколько потоков используют одно и то же соединение с базой данных, лучше всегоAPIКод части вызова и обработки ошибок инкапсулирован в области кода ключа (criticalsection) В. Программисты могут использоватьsqlite3_db_mutexФункция получает указатель мьютекса соединения с базой данных (указатель наsqlite3_mutexУказатель объекта).

V2ВерсияprepareФункция (Preparev2

Следующая таблица является оригинальной версиейprepareФункция иv2ВерсияprepareСравнение функций:

V2ВерсияprepareЭта функция более лаконична для обработки ошибок, а также дляschemaПреимущества, поэтому рекомендуется использоватьv2ВерсияprepareФункция.

Транзакции и ошибки (TransactionsandErrors

Как правило,SQliteОперация в режиме автоматической фиксации.SQliteАвтоматически ставить каждыйSQLКоманды заключены в транзакции. Если каждый оператор инкапсулирован в свою собственную транзакцию, то восстановление после ошибок просто. когдаSQLiteЕсли он оказывается в состоянии ошибки, он может просто откатить текущую транзакцию. Это может эффективно отменить текущийSQLВыполните команду и верните базу данных в состояние до появления ошибки.

Однако однаждыBEGINTRANSACTIONВыполнение команды,SQliteБольше не находится в режиме автоматической фиксации. Транзакция открыта, она останется открытой доENDTRANSACTIONилиCOMMITTRANSACTIONВыполнение команды. Это позволяет несколькоSQLКоманды инкапсулируются в транзакцию, поэтому ряд дискретных команд либо выполняется, либо не выполняется (атомарные операции), но это также ограничиваетSQLiteОшибка восстановления.

Когда отображается (explicit) Произошла ошибка во время выполнения транзакции,SQLiteПопытка отменить только что выполненное заявление. К сожалению, это не всегда возможно. Если дела плохи,SQliteИногда всю текущую транзакцию можно только откатить, и другого варианта нет.

Ошибка, наиболее вероятная для отката:SQLITE_FULL(База данных или дисковое пространство заполнено),SQLITE_IOERR(дискIOОшибка или файл заблокирован),SQLITE_BUSY(Блокировка базы данных),SQLITE_NOMEM(Недостаточно памяти),SQLITE_INTERRUPT(Прерывание). Если программа выполняет транзакцию отображения и получает одну из этих ошибок, будьте готовы к возможному откату транзакции.

  1. intsqlite3_get_autocommit(sqlite3*);
int sqlite3_get_autocommit(sqlite3*);

С помощью этой функции вы можете получить текущий статус отправки. Если он возвращает не0Значение, база данных отправляется автоматически (atutoconmit) Режим. Если вернуться0База данных находится в транзакции отображения (thedatabaseiscurrentlyinsideanexplicittransaction)。

еслиSQliteБаза данных вынуждена выполнить операцию полного отката транзакции, после чего база данных снова станет режимом автоматической фиксации транзакции. Если база данных не находится в режиме автоматической фиксации, она должна быть в транзакции, указывая, что откат не требуется.

Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07

Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07

Стандартный код (StandardCodes

Ниже приведено стандартное возвращаемое значение и определение кода ошибки:

  1. #defineSQLITE_OK0/*Successfulresult*/
  2. /*beginning-of-error-codes*/
  3. #defineSQLITE_ERROR1/*SQLerrorormissingdatabase*/
  4. #defineSQLITE_INTERNAL2/*InternallogicerrorinSQLite*/
  5. #defineSQLITE_PERM3/*Accesspermissiondenied*/
  6. #defineSQLITE_ABORT4/*Callbackroutinerequestedanabort*/
  7. #defineSQLITE_BUSY5/*Thedatabasefileislocked*/
  8. #defineSQLITE_LOCKED6/*Atableinthedatabaseislocked*/
  9. #defineSQLITE_NOMEM7/*Amalloc()failed*/
  10. #defineSQLITE_READONLY8/*Attempttowriteareadonlydatabase*/
  11. #defineSQLITE_INTERRUPT9/*Operationterminatedbysqlite3_interrupt()*/
  12. #defineSQLITE_IOERR10/*SomekindofdiskI/Oerroroccurred*/
  13. #defineSQLITE_CORRUPT11/*Thedatabasediskimageismalformed*/
  14. #defineSQLITE_NOTFOUND12/*Unknownopcodeinsqlite3_file_control()*/
  15. #defineSQLITE_FULL13/*Insertionfailedbecausedatabaseisfull*/
  16. #defineSQLITE_CANTOPEN14/*Unabletoopenthedatabasefile*/
  17. #defineSQLITE_PROTOCOL15/*Databaselockprotocolerror*/
  18. #defineSQLITE_EMPTY16/*Databaseisempty*/
  19. #defineSQLITE_SCHEMA17/*Thedatabaseschemachanged*/
  20. #defineSQLITE_TOOBIG18/*StringorBLOBexceedssizelimit*/
  21. #defineSQLITE_CONSTRAINT19/*Abortduetoconstraintviolation*/
  22. #defineSQLITE_MISMATCH20/*Datatypemismatch*/
  23. #defineSQLITE_MISUSE21/*Libraryusedincorrectly*/
  24. #defineSQLITE_NOLFS22/*UsesOSfeaturesnotsupportedonhost*/
  25. #defineSQLITE_AUTH23/*Authorizationdenied*/
  26. #defineSQLITE_FORMAT24/*Auxiliarydatabaseformaterror*/
  27. #defineSQLITE_RANGE25/*2ndparametertosqlite3_bindoutofrange*/
  28. #defineSQLITE_NOTADB26/*Fileopenedthatisnotadatabasefile*/
  29. #defineSQLITE_ROW100/*sqlite3_step()hasanotherrowready*/
  30. #defineSQLITE_DONE101/*sqlite3_step()hasfinishedexecuting*/
  31. /*end-of-error-codes*/
#define SQLITE_OK           0   /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */
#define SQLITE_PERM         3   /* Access permission denied */
#define SQLITE_ABORT        4   /* Callback routine requested an abort */
#define SQLITE_BUSY         5   /* The database file is locked */
#define SQLITE_LOCKED       6   /* A table in the database is locked */
#define SQLITE_NOMEM        7   /* A malloc() failed */
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL        13   /* Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */
#define SQLITE_EMPTY       16   /* Database is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */
#define SQLITE_MISMATCH    20   /* Data type mismatch */
#define SQLITE_MISUSE      21   /* Library used incorrectly */
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* Authorization denied */
#define SQLITE_FORMAT      24   /* Auxiliary database format error */
#define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB      26   /* File opened that is not a database file */
#define SQLITE_ROW         100  /* sqlite3_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite3_step() has finished executing */
/* end-of-error-codes */

Некоторые из этих констант возвращаются только определенной функцией, такой какSQLITE_RANGEТолькоsqlite3_bind_xxxФункция возвращает. Есть некоторые константы, такие какSQLITE_ERRORЭто может только объяснить, что произошла ошибка во время выполнения функции, но невозможно узнать причину ошибки.

SQLITE_MISUSEОт имениAPIБыл неправильно использован. Например, заявлениеsqlite3_stepПосле выполнения функции и до ее сброса, снова свяжите параметры с ней, в это времяbindФункция вернетсяSQLITE_MISUSE

Код расширения (ExtendedCodes

Стандартный код ошибки предоставляет меньше информации о причине ошибки. Поэтому иногда мы будем использовать расширенные коды ошибок. Расширенный код ошибки основан на стандартном коде ошибки, а его младший байт является исходным стандартным кодом ошибки, а затем дополнительная информация добавляется к старшему байту «или» для описания подробностей ошибки.

  1. intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);

Из-за учета совместимости старых программ заказчика эти расширенные коды ошибок не включены по умолчанию. Программисты могут пройтиsqlite3_extended_result_codesФункция включает или отключает расширенные коды ошибок.

Ниже приведены все расширенные коды ошибок (большинство из которых используются для описанияSQLITE_IOERR):

  1. #defineSQLITE_IOERR_READ(SQLITE_IOERR|(1<<8))
  2. #defineSQLITE_IOERR_SHORT_READ(SQLITE_IOERR|(2<<8))
  3. #defineSQLITE_IOERR_WRITE(SQLITE_IOERR|(3<<8))
  4. #defineSQLITE_IOERR_FSYNC(SQLITE_IOERR|(4<<8))
  5. #defineSQLITE_IOERR_DIR_FSYNC(SQLITE_IOERR|(5<<8))
  6. #defineSQLITE_IOERR_TRUNCATE(SQLITE_IOERR|(6<<8))
  7. #defineSQLITE_IOERR_FSTAT(SQLITE_IOERR|(7<<8))
  8. #defineSQLITE_IOERR_UNLOCK(SQLITE_IOERR|(8<<8))
  9. #defineSQLITE_IOERR_RDLOCK(SQLITE_IOERR|(9<<8))
  10. #defineSQLITE_IOERR_DELETE(SQLITE_IOERR|(10<<8))
  11. #defineSQLITE_IOERR_BLOCKED(SQLITE_IOERR|(11<<8))
  12. #defineSQLITE_IOERR_NOMEM(SQLITE_IOERR|(12<<8))
  13. #defineSQLITE_IOERR_ACCESS(SQLITE_IOERR|(13<<8))
  14. #defineSQLITE_IOERR_CHECKRESERVEDLOCK(SQLITE_IOERR|(14<<8))
  15. #defineSQLITE_IOERR_LOCK(SQLITE_IOERR|(15<<8))
  16. #defineSQLITE_IOERR_CLOSE(SQLITE_IOERR|(16<<8))
  17. #defineSQLITE_IOERR_DIR_CLOSE(SQLITE_IOERR|(17<<8))
  18. #defineSQLITE_IOERR_SHMOPEN(SQLITE_IOERR|(18<<8))
  19. #defineSQLITE_IOERR_SHMSIZE(SQLITE_IOERR|(19<<8))
  20. #defineSQLITE_IOERR_SHMLOCK(SQLITE_IOERR|(20<<8))
  21. #defineSQLITE_IOERR_SHMMAP(SQLITE_IOERR|(21<<8))
  22. #defineSQLITE_IOERR_SEEK(SQLITE_IOERR|(22<<8))
  23. #defineSQLITE_LOCKED_SHAREDCACHE(SQLITE_LOCKED|(1<<8))
  24. #defineSQLITE_BUSY_RECOVERY(SQLITE_BUSY|(1<<8))
  25. #defineSQLITE_CANTOPEN_NOTEMPDIR(SQLITE_CANTOPEN|(1<<8))
  26. #defineSQLITE_CORRUPT_VTAB(SQLITE_CORRUPT|(1<<8))
  27. #defineSQLITE_READONLY_RECOVERY(SQLITE_READONLY|(1<<8))
  28. #defineSQLITE_READONLY_CANTLOCK(SQLITE_READONLY|(2<<8))
#define SQLITE_IOERR_READ              (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ        (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE             (SQLITE_IOERR | (3<<8))
#define SQLITE_IOERR_FSYNC             (SQLITE_IOERR | (4<<8))
#define SQLITE_IOERR_DIR_FSYNC         (SQLITE_IOERR | (5<<8))
#define SQLITE_IOERR_TRUNCATE          (SQLITE_IOERR | (6<<8))
#define SQLITE_IOERR_FSTAT             (SQLITE_IOERR | (7<<8))
#define SQLITE_IOERR_UNLOCK            (SQLITE_IOERR | (8<<8))
#define SQLITE_IOERR_RDLOCK            (SQLITE_IOERR | (9<<8))
#define SQLITE_IOERR_DELETE            (SQLITE_IOERR | (10<<8))
#define SQLITE_IOERR_BLOCKED           (SQLITE_IOERR | (11<<8))
#define SQLITE_IOERR_NOMEM             (SQLITE_IOERR | (12<<8))
#define SQLITE_IOERR_ACCESS            (SQLITE_IOERR | (13<<8))
#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
#define SQLITE_IOERR_LOCK              (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR_CLOSE             (SQLITE_IOERR | (16<<8))
#define SQLITE_IOERR_DIR_CLOSE         (SQLITE_IOERR | (17<<8))
#define SQLITE_IOERR_SHMOPEN           (SQLITE_IOERR | (18<<8))
#define SQLITE_IOERR_SHMSIZE           (SQLITE_IOERR | (19<<8))
#define SQLITE_IOERR_SHMLOCK           (SQLITE_IOERR | (20<<8))
#define SQLITE_IOERR_SHMMAP            (SQLITE_IOERR | (21<<8))
#define SQLITE_IOERR_SEEK              (SQLITE_IOERR | (22<<8))
#define SQLITE_LOCKED_SHAREDCACHE      (SQLITE_LOCKED |  (1<<8))
#define SQLITE_BUSY_RECOVERY           (SQLITE_BUSY   |  (1<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR      (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CORRUPT_VTAB            (SQLITE_CORRUPT | (1<<8))
#define SQLITE_READONLY_RECOVERY       (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK       (SQLITE_READONLY | (2<<8))

ErrorСвязанные функции (ErrorFunctions

  1. intsqlite3_extended_result_codes(sqlite3*,intonoff);
int sqlite3_extended_result_codes(sqlite3*, int onoff);

Для подключения к базе данных включите или отключите использование расширенных кодов ошибок. Даваяsqlite3_extended_result_codesПервая функция2Параметры передают ненулевые значения, чтобы включить расширенные коды ошибок. Функция всегда возвращаетSQLITE_OK, Нет способа узнать, включен ли расширенный код ошибки в данный момент.

  1. intsqlite3_errcode(sqlite3*db);
int sqlite3_errcode(sqlite3 *db);

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

  1. intsqlite3_extended_errcode(sqlite3*db);
int sqlite3_extended_errcode(sqlite3 *db);

иsqlite3_errcodeФункция аналогична, за исключением того, что она возвращает только расширенный код ошибки.

  1. constchar*sqlite3_errmsg(sqlite3*);
  2. constvoid*sqlite3_errmsg16(sqlite3*);
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);

Возвращает строку кода ошибки, используйтеUTF-8илиUTF-16Кодирование. Программист должен вызвать эти две функции сразу после получения информации о коде ошибки или сделать копию. Потому что следующая операция с базой данных может привести к тому, что возвращенный указатель на строку будет недействительным.

SQliteОбработка ошибок не может обрабатывать несколько ошибок одновременно, таких какAPIПроизошла ошибка при вызове функции, и программист не проверил ошибку, затем в следующий разAPIВызов функции может вернутьсяSQLITE_MISUSE, Указывая, что программа пыталась использовать недопустимую структуру данных. Так программисты должныAPIПроверьте и обработайте все ошибки, которые могут возникнуть после вызова функции.

Кроме того, если несколько потоков используют одно и то же соединение с базой данных, лучше всегоAPIКод части вызова и обработки ошибок инкапсулирован в области кода ключа (criticalsection) В. Программисты могут использоватьsqlite3_db_mutexФункция получает указатель мьютекса соединения с базой данных (указатель наsqlite3_mutexУказатель объекта).

V2ВерсияprepareФункция (Preparev2

Следующая таблица является оригинальной версиейprepareФункция иv2ВерсияprepareСравнение функций:

V2ВерсияprepareЭта функция более лаконична для обработки ошибок, а также дляschemaПреимущества, поэтому рекомендуется использоватьv2ВерсияprepareФункция.

Транзакции и ошибки (TransactionsandErrors

Как правило,SQliteОперация в режиме автоматической фиксации.SQliteАвтоматически ставить каждыйSQLКоманды заключены в транзакции. Если каждый оператор инкапсулирован в свою собственную транзакцию, то восстановление после ошибок просто. когдаSQLiteЕсли он оказывается в состоянии ошибки, он может просто откатить текущую транзакцию. Это может эффективно отменить текущийSQLВыполните команду и верните базу данных в состояние до появления ошибки.

Однако однаждыBEGINTRANSACTIONВыполнение команды,SQliteБольше не находится в режиме автоматической фиксации. Транзакция открыта, она останется открытой доENDTRANSACTIONилиCOMMITTRANSACTIONВыполнение команды. Это позволяет несколькоSQLКоманды инкапсулируются в транзакцию, поэтому ряд дискретных команд либо выполняется, либо не выполняется (атомарные операции), но это также ограничиваетSQLiteОшибка восстановления.

Когда отображается (explicit) Произошла ошибка во время выполнения транзакции,SQLiteПопытка отменить только что выполненное заявление. К сожалению, это не всегда возможно. Если дела плохи,SQliteИногда всю текущую транзакцию можно только откатить, и другого варианта нет.

Ошибка, наиболее вероятная для отката:SQLITE_FULL(База данных или дисковое пространство заполнено),SQLITE_IOERR(дискIOОшибка или файл заблокирован),SQLITE_BUSY(Блокировка базы данных),SQLITE_NOMEM(Недостаточно памяти),SQLITE_INTERRUPT(Прерывание). Если программа выполняет транзакцию отображения и получает одну из этих ошибок, будьте готовы к возможному откату транзакции.

  1. intsqlite3_get_autocommit(sqlite3*);
int sqlite3_get_autocommit(sqlite3*);

С помощью этой функции вы можете получить текущий статус отправки. Если он возвращает не0Значение, база данных отправляется автоматически (atutoconmit) Режим. Если вернуться0База данных находится в транзакции отображения (thedatabaseiscurrentlyinsideanexplicittransaction)。

еслиSQliteБаза данных вынуждена выполнить операцию полного отката транзакции, после чего база данных снова станет режимом автоматической фиксации транзакции. Если база данных не находится в режиме автоматической фиксации, она должна быть в транзакции, указывая, что откат не требуется.

Интерфейс программирования базы данных SQlite C (шесть), возвращаемое значение и код ошибки (коды результатов и коды ошибок) от Xiefeng Xiyu QQ: 253786989 2012-02-07

Понравилась статья? Поделить с друзьями:
  • Sqlite error 14 unable to open database file
  • Sqlite drop column error
  • Sqlite database error database disk image is malformed
  • Sqlite commit error
  • Sqlite cant open error 14