2011-01-30 53 views
5

我一直在使用我的F-Spot數據庫有問題,但沒有任何瑕疵。然而,現在看起來就像我一樣。我甚至無法啓動F-Spot,因爲它在啓動時崩潰。檢查控制檯,什麼打破它是一個UriFormatException消息「System.UriFormatException:URI方案必須以字母開頭,必須包含字母,數字,'+',' - '或'。'之一。字符。」。這是在Mono 2.4.4.0上運行的,而不是微軟的運行時。從簡單的Mono/C#應用程序中讀取SQLite3數據庫?

基本上,我試圖找出確切的數據行被破壞,所以我可以修復它們,或者提交一個針對F-Spot的錯誤報告。 (我之前一直在數據庫文件中進行干涉,這可能會造成這種麻煩 - 無論哪種方式,它似乎應該像處理這樣的事情比通過崩潰很難,但在這一刻,我更感興趣在修復數據的過程中,不是以更優雅的方式處理失敗的確切原因。)數據庫是一個SQLite3文件,並在命令行sqlite3應用程序中手動運行它,以及數據表本身。然而,我從一個簡單的測試應用程序中得到了一個來自Mono.Data.SqliteClient.SqliteConnection.Open()的未處理異常System.ApplicationException: file is encrypted or is not a database,這個應用程序除了從the official guide for SQLite and Mono複製粘貼外沒有其他任何東西。鏈接對System.Data.dll中和Mono.Data.SqliteClient.dll,我在這裏複製的相關代碼,以及用於完整性:

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; 
} 

數據庫文件肯定是有,並且工作正常(sqlite3的本身具有沒有抱怨)。谷歌搜索網頁我很多頁面比較各種小型數據庫引擎,並提示可能是一個SQLite2數據庫的文件。但是,AFAIK我的系統上沒有SQLite2庫,並且file明確聲稱該文件是「SQLite 3.x數據庫」。不僅如此,F-Spot版本比0.3.5 require SQLite 3更新,而且我的版本是0.6.2,並且已經有很長一段時間了。我是否嘗試使用錯誤的API來閱讀它,或者是因爲DSN錯誤?

有關如何嘗試的建議,將不勝感激。當然,我可以使用sqlite3來提取數據,將其保存到文本文件中,然後解析這些數據,但是這引入了另外幾層不確定性,如果可能的話,我會盡可能避免使用與F-Spot相同的API因爲我可以訪問數據。

回答

4

我想你需要專門設置連接字符串中的sqlite引擎版本。嘗試將「version = 3」添加到連接字符串常量中。我更改了一下你的代碼,看看它是否適合你。

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; 
} 

欲瞭解更多詳細信息,查看文檔here

希望這可以幫助的「連接字符串格式」部分,對於

相關問題