2013-09-10 3 views
0

У меня есть следующий сценарий:Файл не записывается на System.Data.SQLite на долю окон после сбоя в сети

WPF приложений с использованием SQLite-файл на System.Data.SQLite на Windows-акцию как бэкэнда. Клиент - Windows 7 Home Edition

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

Она сказала, что сессия длилась примерно до 11:50 утра - метка времени на файл SQLite в вопросе не было 10:55 утра. У меня есть файл журнала в том же сетевом ресурсе, он написан на использование файлового архива с автозапуском.

Файл журнала выглядит нормально до 10:55, то есть одна линия с мусором (выглядит как несколько строк, написанных вместе в одном), затем идет в нормальном режиме.

Очевидно, что в то время сеть (или, возможно, привод) имела икоту. Чудесно мое приложение просто продолжалось как обычно. Никаких исключений не было выбрано, в соответствии с лог-файлом все транзакции «завершены». Нет файла журнала, чтобы рассказать историю. Такое поведение - хотя wonderous само по себе - не ценится пользователем :)

Мой вопрос: что здесь произошло, и как я могу предотвратить это в будущем? Запустила ли Windows 7 файл в резервном списке и не заботится о внесении изменений в фактический диск? Почему мое приложение или поставщик SQLite не знают об этом?

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

Спасибо

TL; DR SQlite файл не показывает никаких изменений после Моментально аппаратных средств (сети или диск) отказа, но приложение, похоже, продолжает функционировать, и никакие исключения не бросаются System.Data.SQLite.

ответ

0

См. Раздел 3 из How To Corrupt An SQLite Database File; похоже, что Windows не синхронизировала сетевой ресурс, когда SQLite сказал об этом.

+0

Хорошо, но если это так, то будет мое утверждение, проверяя метки времени работы файла на всех, или ОСА «обманывают на» привод и думают, что файл на самом деле было изменено? Я думаю, что это редкое условие, но мы все знаем, что мое приложение будет обвинено в том, что он «не сохраняет данные». – themightylc

+0

Все, что вы читаете, относится к кешу операционной системы, а не к текущему диску. –

+0

Подтверждено. Таким образом, хорошая долгосрочная инвестиция будет сохранять информацию о восстановлении данных локально и проверять перезагрузку, если эта информация действительно находится в файле базы данных, и попросить пользователя восстановить или отменить эту информацию? Как Office Suite? У меня уже есть подобная «проектная» система, подобная реализованной, но она хранится в той же папке, что и бэкэнд - herpderp: o) – themightylc