Nie można usunąć bazy danych mimo jej zamknięcia.

0

Witam.

Bawię się z SQLite w C#.

Mimo użycia wszelkich kombinacji:

MySQLiteConnection.Close();
MySQLiteConnection.Dispose();
MySQLiteConnection = null;
SQLiteConnection.ClearAllPools()

Próba usunięcia pliku bazy danych aplikacja zwraca wyjątek.
Orientujecie się co z tym zrobić ?

0
connection.Close();
GC.Collect();
File.Delete(dbFileName);

A coś takiego?

0

Problem przed chwilą udało się rozwiązać (należało wywołać metodę .Dispose() również na użytych na tej bazie SQLiteCommand i SQLiteDataReader).

Jednak z ciekawości dopytam:
widziałem wcześniej w necie to rozwiązanie tylko nie bardzo wiedziałem czym jest obiekt GC (na którym wywoływana jest metoda .Collect() ) ?

0

GC to skrót od garbage collectora, czyli "odśmiecacza" zajmującego się zwalnianiem pamięci w językach typu C#, Java (...).
Generalnie działa on w tle i uruchamia się wtedy, gdy uznaje, że np. zaczyna brakować pamięci (popularne mark-and-sweep, choć implementacji jest tyle, ile VMek).

0

Dzięki za info Patryk.
Nie wiem jak ja to wcześniej robiłem ale wydawało mi się, że Visual nie "widzi" klasy "GC"... :/

Tak czy inaczej, użycie GC.Collect(); nie rozwiązuje problemu (na chwile zakomentowałem wspomniane wcześniej .Dispose()).

2

To dobrze, GC.Collect() nie ma prawa rozwiązać żadnego problemu z zasobami, którymi nie zarządza, takimi jak: pliki, bazy danych, połączenia sieciowe, itd.
Wszystkie tego typu zasoby zawsze należy zwalniać wołając na wszystkich obiektach, które z nich korzystają metodę Dispose. Albo jeszcze lepiej używać tych obiektów w konstrukcji using, wtedy nie trzeba pamiętać o wołaniu Dispose ręcznie.

0

Problem znów się pojawił i to w dość nie oczekiwanym dla mnie miejscu...
Tak jak pisałem bazy nie można było usunąć ponieważ wcześniej używany był na niej np SQLiteCommand który trzeba było zwolnić.
Teraz problem powstaje przy użyciu MySQLiteDataBase.State np:

if (MySQLiteDataBase.State != ConnectionState.Open)
{} 

Użycie tej właściwości blokuje plik bazy danych.
Mimo wywołania

MySQLiteDataBase.Close();
MySQLiteDataBase.Dispose();
MySQLiteDataBase = null;
SQLiteConnection.ClearAllPools(); 

Zakomentowanie tych trzech linijek rozwiązuje problem (bazę można usunąć).
Co z tym zrobić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1