Сообщение об исключении: Произошла ошибка ввода-вывода - PullRequest
5 голосов
/ 20 октября 2010

Я получаю эту ошибку, когда пытаюсь выполнить запрос на обновление базы данных SQLite. Это происходит только на XP (на Vista работает нормально). База данных создается без каких-либо проблем, вставка также работает нормально. Я также проверил и у меня есть разрешения и доступное дисковое пространство (поскольку sqlite.org говорит, что это возможные причины).

Ответы [ 4 ]

13 голосов
/ 14 декабря 2010

Один ответ, который сработал для меня, - это использовать оператор PRAGMA , чтобы установить значение journal_mode в значение, отличное от «DELETE». Вы делаете это, выполняя оператор PRAGMA, такой как PRAGMA journal_mode = OFF, точно так же, как и оператор запроса. Я опубликовал пример этого, используя c # на: http://www.stevemcarthur.co.uk/blog/post/some-kind-of-disk-io-error-occurred-sqlite/

Редактировать

Вероятно, лучшее утверждение PRAGMA для выдачи - PRAGMA journal_mode = TRUNCATE, а не "OFF", как предложили несколько других.

3 голосов
/ 16 января 2012

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

Ваши симптомы указывают на то, что SQLite может читать и писать, но не может удалить файл журнала.

3 голосов
/ 14 июня 2011

За http://www.sqlite.org/pragma.html#pragma_journal_mode (выделено мое):

Режим журналирования OFF полностью отключает журнал отката. Журнал отката никогда не создается, и, следовательно, журнал отката никогда не удаляется. Режим журналирования OFF отключает атомарные возможности фиксации и отката SQLite. Команда ROLLBACK больше не работает; он ведет себя неопределенным образом. Приложения должны избегать использования команды ROLLBACK, когда режим журнала выключен. Если сбой приложения происходит в середине транзакции, когда установлен режим журналирования OFF, то файл базы данных, скорее всего, испортится.

Звучит так, будто вы на правильном пути, но один из других вариантов будет безопаснее.

2 голосов
/ 22 октября 2014

Другой возможностью было бы использование следующего оператора SQL

"PRAGMA journal_mode = TRUNCATE"

Он по-прежнему сохраняет журнал, поэтому, если во время транзакции происходит сбой питания, вы по-прежнему можете выполнить откат и избежать повреждения базы данных.Разница между DELETE и TRUNCATE заключается в том, что команда delete создает и удаляет файл журнала для каждого оператора.Truncate нужно создать только один раз и просто перезаписать.В моем случае это было намного быстрее, и я избежал странных разрешений, которые идут со стандартным journal_mode = DELETE.

Пожалуйста, обратитесь к Расширение SQlite3 Pragma_journal_mode

...