2015-08-04 9 views
8

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

System.Data.SQLite.SQLiteException (0x80004005): Attempt to write a read-only database 
attempt to write a readonly database 
    at System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt) 
    at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt) 
    at System.Data.SQLite.SQLiteDataReader.NextResult() 
    at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave) 
    at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery() 

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

Я попытался использовать прагму, чтобы иметь как журнал, так и temp_store в памяти вместо файла в случае, если между ними есть какая-то разногласия, но я все равно получаю ошибку. Я всегда получаю ошибку в том же методе, который впервые вставляется в соединение. Чтобы дать общее представление о том, что делает приложение, оно охватывает все случаи, собирает информацию об этих случаях (не из SQLite), а затем записывает результаты в базу данных SQLite.

Я не знаю, что еще попробовать.

* edit Я также использую PRAGMA journal_mode = MEMORY. При вставке данных в базу данных SQLite я сначала запускаю оператор BEGIN, а затем кучу вставок перед оператором END. Ошибка возникает при первой вставке.

+0

_ «Я попытался использовать прагму, чтобы иметь как журнал, так и temp_store в памяти вместо файла, если там может быть какая-то разногласия между приложениями». Там не будет. Как вы открываете базу данных? Является ли папка базой данных доступной для записи? –

+1

Да, папка, в которой находится база данных, может быть записана. Большинство итераций правильно вставляют данные в базу данных. Я открываю базу данных только через инструкцию using вокруг SQLiteConnection. – UWSkeletor

ответ

6

Это вопрос с разрешениями.

Убедитесь, что ваше веб-приложение, которое размещено, имеет возможность добавлять/записывать/создавать/удалять доступ к папке, в которой хранится база данных sqlite.

Для получения более подробной информации см this

+2

Спасибо, но как это может быть проблема с разрешениями, если она случайна? Приложение успешно записывается в базу данных. Эта ошибка возникает только при случайных итерациях. – UWSkeletor

+0

Я согласен с @UWSkeletor. Что еще? – 2ndGAB

0

Может быть также, что файл базы данных не поддерживается MigrationAssembly.

Такое же исключение возникает, когда EF пытается выполнить миграцию на файл, который, как ожидается, является базой данных SQLite, которая является fi. текстовый файл.

Смежные вопросы