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

a C*_*CVn 5 c# sqlite mono

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

基本上,我试图找出哪些确切的数据行被破坏,所以我可以修复它们,或者提交针对F-Spot的错误报告.(我之前一直在干扰数据库文件,这可能会造成这样的麻烦 - 无论哪种方式,它看起来应该像处理那样更好地处理这样的事情,但是在这个时刻我更感兴趣修复数据的确切原因不是以稍微优雅的方式处理故障的确切原因.)数据库是SQLite3文件,并在命令行sqlite3应用程序中手动运行,我也可以同时选择表元数据作为数据表本身.然而,我System.ApplicationException: file is encrypted or is not a database从一个简单的测试应用程序中获得Mono.Data.SqliteClient.SqliteConnection.Open()的未处理异常,除了来自SQLite和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;
}
Run Code Online (Sandbox Code Playgroud)

数据库文件肯定存在,工作正常(sqlite3本身没有任何投诉).谷歌搜索给我很多页面比较各种小型数据库引擎,并提示该文件可能是SQLite2数据库.但是,AFAIK我的系统上没有SQLite2库,file特别声称该文件是"SQLite 3.x数据库".不仅如此,低于0.3.5的F-Spot版本需要SQLite 3,而我的版本为0.6.2,并且已经存在很长一段时间了.我是否尝试使用错误的API读取它,或者DSN是否错误?

任何有关尝试的建议都将受到赞赏.当然我可以使用sqlite3提取数据,将其保存到文本文件,然后解析这些数据,但这引入了另外几层不确定性,如果可能的话,通过使用与F-Spot尽可能接近的相同API,我真的很想避免.我可以访问数据.

ser*_*nko 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;
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看此处文档的“连接字符串格式”部分

希望这有帮助,问候