更新System.Data.SQLite.dll后,SQLite URI无效

3
我最初使用的是SQLite版本:1.0.77.0 (sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.77.0),一切正常。但在将System.Data.SQLite.dll更新到版本1.0.82.0 (sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.82.0)后,出现了以下错误信息:“无法打开数据库。连接字符串为:'datetimeformat=ISO8601;synchronous=Off;uri="file://C:/Users/username/Documents/data/test.db";version=3;journal mode=Truncate;default isolationlevel=ReadCommitted;pooling=True'; 错误信息:'System.InvalidOperationException: Invalid connection string: invalid URI”。我还尝试了使用file:///代替file://,但没有成功。请问有人能告诉我URI出了什么问题吗?为什么在v1.0.82.0中不再起作用,而在v1.0.77.0中却可以?(1.0.82.0 == 3.7.14) 可以查看http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

1
如果您使用 DataSource 字符串而不是 Uri,会发生什么? - zeFrenchy
没试过这个...有文档吗?有什么区别/限制吗? - juFo
5个回答

4

获取正确的连接字符串的最佳方法是始终使用SQLiteConnectionStringBuilder类来生成它们。

SQLiteConnectionStringBuilder conn_builder = new SQLiteConnectionStringBuilder 
{ 
   DateTimeFormat = SQLiteDateFormats.ISO8601,
   SyncMode = SynchronizationModes.Off,
   Version = 3,
   JournalMode = SQLiteJournalModeEnum.Truncate,
   DefaultIsolationLevel = System.Data.IsolationLevel.ReadCommitted,
   Pooling = true,
   Uri = new Uri(@"c:\tmp\db.sqlite").AbsoluteUri
 };
 string conn_str = conn_builder.ConnectionString;

如果 Uri 无法使用,请尝试设置 DataSource(如果您正在使用本地文件)。一个快速的检查显示,DataSourceSQLiteConnection.cs 中先于 Uri 进行评估,并且优先于它,因此如果在 Uri 处理中存在错误,则使用 DataSource 可能有助于绕过它。

1
你尝试过使用“数据源”来确保其他所有内容都正常吗? - zeFrenchy
当我使用 builder.DataSource = this.Uri.AbsolutePath; 时,有时候它能够工作。但我不确定这是否是一个好的方式 :s - juFo
我的意思是直接将路径用于DataSource,完全不需要使用Uri对象。所以你是说有时可以工作?你的意思是并不总是可行的?这个文件能够通过其他方式可靠地访问吗?比如使用众多的SQLite管理器之一? - zeFrenchy
我找到了解决方案。builder.DataSource = Uri.AbsolutePath.Replace(@"\", @"").Replace("%20", " "); 我只是从uri中获取路径,但如果我通过其他方式获取它,我仍然需要将双反斜杠替换为单个反斜杠,并将%20替换为空格。非常奇怪,这是唯一有效的方法。感谢您的DataSource建议。与使用Uri相比,这实际上会改变什么? - juFo
SQLite文档简单地将DataSource描述为Uri的替代品。我认为它假定您提供了本地路径,但要确定唯一的方法是检查System.Data.SQLite的源代码。很高兴你找到了一个解决办法...尽管有点丑陋。 - zeFrenchy
显示剩余3条评论

2
根据文档,从版本1.0.82.0开始,以下内容已更改:

通过新的FullUri连接字符串属性添加对URI文件名的支持。

例如:

var connection = new SQLiteConnection("FullUri=file:mydb.sqlite?cache=shared");

1

以下内容对我有效,对于以下示例,您不能不使用数据源

FullUri=file::memory:?cache=shared

0

我认为你应该尝试将连接字符串简化到基础部分,然后再添加选项。

例如,可以查看此网站上的 SQLite 连接字符串选项。

http://www.connectionstrings.com/sqlite

当你试图在URI中转义空格时,3 ///仅有效。我还建议你将数据库从用户文件夹移到C:\的根目录,以防止访问权限无效,并且这也意味着更简单的连接字符串供你尝试。

祝好运


0

它在使用三个斜杠时无法正常工作(因为在v1.0.77.0版本中存在某种错误,它应该使用两个斜杠而不是三个斜杠)。但是,在v1.0.82.0版本中更改这个并不能解决问题。 - juFo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接