2011-01-30 31 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

希望这可以帮助的“连接字符串格式”部分,对于

相关问题