2015-08-04 14 views
8

Mam aplikację konsoli, która zapełnia bazę danych SQLite. Gdy aplikacja działa samodzielnie, nie dostaję żadnych błędów. Jeśli uruchomić wiele instancji aplikacji, gdzie każda aplikacja jest w osobnym folderze i każdy wypełnia swoją własną bazę będę od czasu do czasu pojawia się następujący wyjątek:SQLite próbuje zapisać błąd tylko do odczytu bazy danych

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() 

wiem DB nie jest tylko do odczytu, ponieważ już zapisał dane do tej bazy danych. Ponadto aplikacja będzie kontynuowana i będzie nadal zapełniać dane w tej bazie danych. Nie powtórzyłem błędu, gdy działa tylko jedna instancja aplikacji.

Próbowałem użyć pragmy, aby mieć zarówno dziennik, jak i temp_store w pamięci, zamiast w pliku, na wypadek, gdyby mógł wystąpić konflikt między aplikacjami, ale nadal dostaję błąd. Zawsze otrzymuję błąd w tej samej metodzie, co jest pierwszym przypadkiem, w którym wstawiłbym się do połączenia. Aby dać ogólne pojęcie o tym, co robi aplikacja, zapętla się nad przypadkami, zbiera informacje o tych przypadkach (nie z SQLite), a następnie zapisuje wyniki w bazie danych SQLite.

Nie wiem, co jeszcze można spróbować.

* edycja Używam również PRAGMA journal_mode = MEMORY. Podczas wstawiania danych do bazy danych SQLite najpierw uruchamiam instrukcję BEGIN, a następnie kilka wstawek przed instrukcją END. Błąd występuje na pierwszej wstawce.

+0

_ "Próbowałem użyć pragmy, aby mieć zarówno dziennik, jak i temp_store w pamięci zamiast w pliku, na wypadek, gdyby mógł wystąpić konflikt pomiędzy aplikacjami" _ Nie będzie. Jak otwierasz bazę danych? Czy folder, w którym baza danych jest zapisywalny? –

+1

Tak, folder, w którym znajduje się baza danych, można zapisać. Większość iteracji poprawnie wstawia dane do bazy danych. Otwieram bazę danych za pomocą instrukcji using wokół SQLiteConnection. – UWSkeletor

Odpowiedz

6

To jest problem uprawnień.

Upewnij się, że hostowana aplikacja internetowa ma dodawać/zapisywać/tworzyć/usuwać dostęp do folderu, w którym znajduje się baza danych sqlite.

Aby uzyskać więcej informacji, patrz this

+2

Dzięki, ale jak to może być problem z uprawnieniami, jeśli jest losowy? Aplikacja pomyślnie zapisuje dane w bazie danych. Tylko w przypadkowych iteracjach dostaje ten błąd. – UWSkeletor

+0

Zgadzam się z @UWSkeletor. Co jeszcze? – 2ndGAB

0

Może być również, że plik bazy danych nie jest obsługiwany przez MigrationAssembly.

Ten sam wyjątek jest zgłaszany, gdy EF próbuje przeprowadzić migrację na pliku, który ma być bazą danych SQLite, która jest fi. plik tekstowy.

Powiązane problemy