2011-01-30 11 views
5

Przez pewien czas miałem problemy z moją bazą danych F-Spot, ale nic nie wyniszczało. Teraz jednak wydaje mi się, że to robię; Nie mogę nawet uruchomić F-Spot, ponieważ zawiesza się przy starcie. Sprawdzanie konsoli, która to łamie, to UriFormatException z komunikatem "System.UriFormatException: schemat URI musi zaczynać się od litery i musi składać się z alfabetu, cyfr," + "," - "lub". " postać.". Działa w środowisku Mono 2.4.4.0, a nie w środowisku wykonawczym Microsoftu.Czytanie bazy danych SQLite3 z prostej aplikacji Mono/C#?

Zasadniczo próbuję dowiedzieć się, jakie wiersze danych są uszkodzone, więc mogę je naprawić, lub zgłosić raport o błędzie przeciwko F-Spot. (Wcześniej wtrącałem się bezpośrednio do pliku bazy danych, co mogło spowodować te kłopoty - tak czy owak, wydawałoby się, że powinien poradzić sobie z czymś takim lepiej niż przez awarię, ale w tym momencie jestem bardziej zainteresowany w ustalaniu danych, niż dokładny powód, dla którego niepowodzenie nie jest obsługiwane w nieco bardziej zgrabny sposób.) Baza danych jest plikiem SQLite3 i uruchamiana ręcznie w aplikacji z wiersza poleceń sqlite3. Mogę wybrać obydwa względem metadanych tabeli jako oraz same tabele danych. Dostaję jednak nieobsługiwany wyjątek System.ApplicationException: file is encrypted or is not a database z Mono.Data.SqliteClient.SqliteConnection.Open() z prostej aplikacji testowej, która jest niczym innym niż kopią-wklej od the official guide for SQLite and Mono. Łączenie przed system.data.dll i Mono.Data.SqliteClient.dll, jestem kopiując odpowiedni kod tutaj, jak również dla kompletności:

public static void Main(string[] args) { 
    string connectionString = "URI=file:f-spot.photos.db"; 
    IDbConnection dbcon; 
    dbcon = (IDbConnection) new SqliteConnection(connectionString); 
    dbcon.Open(); 
    dbcon.Close(); 
    dbcon = null; 
} 

Plik bazy danych jest zdecydowanie tam, i działa poprawnie (sqlite3 sam ma żadnych skarg na ten temat). Googling udostępnia mi wiele stron porównujących różne małe bazy danych i podpowiedzi do pliku będącego bazą danych SQLite2. Jednak AFAIK Nie mam żadnych bibliotek SQLite2 w moim systemie, a file konkretnie twierdzi, że plik jest "bazą danych SQLite 3.x". Co więcej, wersje F-Spot nowsze niż 0.3.5 require SQLite 3, a ja jestem w wersji 0.6.2 i już od dłuższego czasu. Czy próbuję go odczytać za pomocą niewłaściwego interfejsu API, czy też przypadkiem DSN jest zły?

Wszelkie sugestie dotyczące tego, co należy wypróbować, będą mile widziane. Oczywiście mogę użyć sqlite3, aby wyodrębnić dane, zapisać je w plikach tekstowych, a następnie przeanalizować je, ale wprowadza to kolejne kilka warstw niepewności, których tak naprawdę chciałbym uniknąć, jeśli to możliwe, używając tak blisko tego samego interfejsu API co F-Spot jak mogę, aby uzyskać dostęp do danych.

Odpowiedz

4

Myślę, że potrzebujesz specjalnie ustawić wersję silnika sqlite w ciągu połączenia. Spróbuj dodać "version = 3" do stałej ciągu połączenia. Zmieniłem trochę twój kod, zobacz, czy to zadziała.

public static void Main(string[] args) { 
    string connectionString = "URI=file:f-spot.photos.db,version=3"; //<-- version is set to 3 
    IDbConnection dbcon; 
    dbcon = (IDbConnection) new SqliteConnection(connectionString); 
    dbcon.Open(); 
    dbcon.Close(); 
    dbcon = null; 
} 

Aby uzyskać więcej informacji sprawdź sekcję "Połączenie format string" dokumentacji here

nadzieję, że to pomaga, chodzi

Powiązane problemy