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

标签 c# mono sqlite

一段时间以来,我的 F-Spot 数据库一直存在问题,但没有严重问题。但是,现在看来我是这样的;我什至无法启动 F-Spot,因为它在启动时崩溃了。检查控制台,中断它的是 UriFormatException 消息“System.UriFormatException: URI scheme must start with a letter and must consisting one of alphabet, digits, '+', '-' or '.'特点。”。这是在 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 数据库。但是,据我所知,我的系统上没有 SQLite2 库,file 特别声明该文件是“SQLite 3.x 数据库”。不仅如此,F-Spot 版本高于 0.3.5 require SQLite 3 ,我的版本是 0.6.2,现在已经有很长一段时间了。我是不是尝试使用错误的 API 来读取它,或者 DSN 是否有可能是错误的?

如有任何尝试建议,我们将不胜感激。当然,我可以使用 sqlite3 来提取数据,将其保存到文本文件,然后解析这些数据,但这又引入了另外几层不确定性,如果可能的话,我宁愿尽可能避免使用我可以使用与 F-Spot 相同的 API 来访问数据。

最佳答案

我认为您需要在连接字符串中专门设置 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

希望这对你有帮助,问候

关于c# - 从简单的 Mono/C# 应用程序读取 SQLite3 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4845406/

相关文章:

ios Sqlite 数据库 - 选择查询

c# - 从 X509 Cert pfx 文件中获取字符串

c# - 如何找到反向也是子序列的最长连续子序列

asp.net - 尝试在 Apache Mono 上托管 .net Web 应用程序

c# - 避免在 Mono 中使用 "unsafe"有什么意义吗?

c# - 将 Mono 应用程序注册到 OSX 上的 Uri 方案

android - 将多个sqlite数据库同步到一个mysql数据库

c# - SQLite 自动递增从 0 开始,然后进程终止

c# - 可以 (a==1 && a==2 && a==3) 在没有多线程的情况下在 C# 中评估为 true 吗?

c# - 为 WPF 标题添加事件处理程序