从简单的Mono / C#应用程序读取SQLite3数据库?

时间:2011-01-30 20:43:16

标签: c# mono sqlite

我的F-Spot数据库出现了一段时间的问题,但没有任何问题。然而,现在,我似乎在做;我甚至无法启动F-Spot,因为它在启动时崩溃了。检查控制台,打破它的是UriFormatException,消息“System.UriFormatException:URI方案必须以字母开头,并且必须包含字母,数字,'+',' - '或'。'之一。字符。”。这是在Mono 2.4.4.0上运行的,而不是Microsoft的运行时。

基本上,我正在尝试找出哪些确切的数据行被破坏,因此我可以修复它们,或者提交针对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来提取数据,将其保存到文本文件中,然后解析这些数据,但这会引入另外几层不确定性,如果可能的话我会通过使用尽可能接近相同的API来避免作为F-Spot,我可以访问数据。

1 个答案:

答案 0 :(得分: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

的“连接字符串格式”部分

希望这有帮助,尊重

相关问题