.Net版SQLite无法访问网络位置的数据库文件-winOpen,os_win.c 36702异常

最近一个C#小程序,希望将SQLite数据库放在网络共享的位置,让多个客户端同时访问。却发现SQLite连接不上该网络位置的数据库,而如果数据库在本地则一切正常。

例如将SQLite数据库 test.dat 放在共享位置:\\System\Data\test.dat,
通过SQLite创建数据库连接,执行Open时,将抛掷异常:

SQLite error (14): os_win.c:36702: (3) winOpen(D:\System\Data\test.dat) - 系统找不到指定的路径。
SQLite error (14): os_win.c:36702: (3) winOpen(D:\System\Data\test.dat) - 系统找不到指定的路径。
SQLite error (14): cannot open file at line 36711 of [9491ba7d73]
“System.Data.SQLite.SQLiteException”类型的第一次机会异常在 System.Data.SQLite.dll 中发生
System.Data.SQLite.SQLiteException (0x80004005): unable to open database file
   在 System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, Int32 maxPoolSize, Boolean usePool)
   在 System.Data.SQLite.SQLiteConnection.Open()
   在 MyMemory.Frame.DAL.SQLiteRunner..ctor(String connectionString) 位置 d:\Work\Program\WPF\MyMemory\MyMemory.Frame\DAL\SQLiteRunner.cs:行号 34
   在 MyMemory.Frame.DAL.DatabaseServices.CreateConnection() 位置 d:\Work\Program\WPF\MyMemory\MyMemory.Frame\DAL\DatabaseServices.cs:行号 23
   在 MyMemory.Frame.DAL.DatabaseServices.Initialize(String dataDir) 位置 d:\Work\Program\WPF\MyMemory\MyMemory.Frame\DAL\DatabaseServices.cs:行号 54
“System.Data.SQLite.SQLiteException”类型的第一次机会异常在 MyMemory.Frame.dll 中发生
System.Data.SQLite.SQLiteException (0x80004005): unable to open database file
   在 System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, Int32 maxPoolSize, Boolean usePool)
   在 System.Data.SQLite.SQLiteConnection.Open()
   ...

即传入的SQLite网络共享路径(以\\开头)在SQLite内部某个环节被转换成为了本地路径!

问题处在SQLite提供的程序集内,那么SQLite最新版本是否已经修复这个问题了(或是从某版故意为之,不让访问网络共享位置的文件了呢)?
到官网http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki下载最新版本( System.Data.SQLite 1.0.94.0 (3.8.6) )替换后重试,还是出现上面的异常。

好吧,既然是开源的,那就下载源代码,看看是什么原因。

下载了之后,采用VS编译,通过解决方案中自带的Test项目,可以输入数据库链接:

点击Run就可以进入断点调试了。

废话少说,直接上结果:

Open过程问题点的方法调用过程如下

\sqlite-netFx-source-1.0.94.1\System.Data.SQLite\SQLiteConnection.cs Line 2372
SortedList<string, string> opts = ParseConnectionString(
          _connectionString, _parseViaFramework);

\sqlite-netFx-source-1.0.94.1\System.Data.SQLite\SQLiteConnection.cs Line 1875
arParts = SQLiteConvert.NewSplit(s, ‘;‘, true, ref error);

\sqlite-netFx-source-1.0.94.1\System.Data.SQLite\SQLiteConvert.cs Line 716
if ((character != EscapeChar) &&
                    (character != QuoteChar) &&
                    (character != separator))

将上面的if ( //(character != EscapeChar) && 注释掉后半行(注意:不推荐这种注释代码的方法)
                    (character != QuoteChar) &&
                    (character != separator))

再编译,重新执行Test.exe 一切OK。

至于为什么有这个限制,源代码中的注释是:

// --Line 709
                // HACK: Only consider the escape character to be an actual
                //       "escape" if it is followed by a reserved character;
                //       otherwise, emit the original escape character and
                //       the current character in an effort to help preserve
                //       the original string content.
                // --Line 715

官方文档说,放在网络位置共享访问的SQLite数据库,在某些特定情况下容易损坏。看来这个问题大神们解决不好,准备干脆屏蔽掉这种使用方式了。

提醒一下,SQLite源码默认用的.Net Framework 4.5,编译时注意切换为项目需要的.Net Framework版本。

最后提供修改后的System.Data.SQLite.dll .Net Framework 4.0版:
下载

转载请注明出处。

(全文完)

时间: 2024-10-11 22:11:32

.Net版SQLite无法访问网络位置的数据库文件-winOpen,os_win.c 36702异常的相关文章

错误代码:0x800704cf 不能访问网络位置(win7 访问不了局域网电脑) .

今天,我们同事请求网络部援助,说是无法访问共享文件夹.然后,让我过去帮助处理一下.访问很慢,然后报错,弹出如下对话框: 1.刚开始,我以为是samba服务出现问题,然后我通过其他局域网内的电脑访问,发现是完全正常的. 2.然后,我通过ping命令,测试一下连接性,发现也是可以正常ping通的,尼玛,我感觉有点玄乎了. 3.然后,禁用.启用网卡,然后在访问共享文件夹, 问题依旧. 4.难道是网卡的问题? 重新安装网卡驱动之后,还是这样的问题. 5.非要重新安装系统(⊙_⊙)?有事没事儿的重装系统,

计算机加入域 不能访问网络位置 解决办法

计算机加入域 不能访问网络位置 解决办法 启动以下服务

c#编写的服务中访问网络位置的共享文件夹

使用LocalSystem运行的服务不能访问共享文件夹,即使共享文件夹权限是对“EveryOne”可读写也不行,目前使用过两种方式,但都需要设置用户密码. 1.使用用户名加密码的方式运行服务. 将 ProjectInstaller 的 Account设置为User 然后打开 ProjectInstaller 的设计器代码 在 InitializeComponent 中设置 ProjectInstaller的Username和Password.运行服务时会直接以设置的用户名运行,可以直接访问该用户

ASP.NET访问网络映射盘&amp;实现文件上传读取功能

最近在改Web的时候,遇到一个问题,要跨机器访问共享文件夹,以实现文件正常上传下载功能. 要实现该功能,可以采用HTTP的方式,也可以使用网络映射磁盘的方式,今天主要给大家分享一下使用网络映射磁盘的方式,来跨机器访问共享文件夹. 解决方案:   本以为只要在Web服务器做一下磁盘映射,然后把该映射盘符当做本地磁盘来使用就可以了,但是却一直有问题,查找了一下资料,是因为IIS默认账户为NETWORK_SERVICE,该账户是没权限访问共享目录的,所以当我们把站点部署到IIS上的时候,再访问映射磁盘

sqlite 修改表名,合并数据库(文件)

修改表名:ALTER TABLE orig_table_name RENAME TO tmp_table_name; 合并2个数据库的表:1.先连接数据库A2.再attach数据库B作为第二数据库:   ATTACH "c:\database_b\places.sqlite" AS SecondaryDB;   (若还要attach其它数据库,则 ATTACH "c:\database_b\third.sqlite" AS ThirdDB;)3.(若要将B中的某个表

windows 10 smb,添加网络位置,输入的文件夹似乎无效

在windows 10中遇到一个现象,在"添加一个网络位置"的时候,弹出"输入的文件夹似乎无效.请选择另一个",我在这里是需要连接到Linux上的smb指定目录,经其它机子测试,smb服务器正常,输入的参数也正常.从smb服务器日志中也没有发现异常现象. 经过多次尝试,发现应该是在访问网络位置的时候,使用的用户及密码不对.由于登录了微软账户,默认使用微软用户进行访问的,所以导致无法访问. 解决方法: 1.改为添加"映射网络驱动器": 2.勾选&q

2-7.访问网络文件共享服务

##访问网络文件共享服务## ##学习目标 挂载网络共享 自动挂载网络共享 1.1##挂载网络文件系统 网络文件系统是由网络附加存储服务器通过网络向多个主机提供的一种文件系统,而不是由块设备(例如硬盘驱动器)提供的.客户端通过特殊的文件系统协议和格式访问远程存储 Linux 中有两种主要协议可用访问网络文件系统 : NFS 和CIFS . NFS ( Network File System ) 可看作是 Linux .UNIX 及其它类似操作系统的标准文件系统. CIFS( Comon Inte

访问网络文件共享服务

第七单元 一 挂载网络文件系统 网络文件系统是由网络附加存储服务器通过网络向多个主机提供的一种文件系统 , 而不是由块设备 ( 例如硬盘驱动器 ) 提供的.客户端通过特殊的文件系统协议和格式访问远程存储 Linux 中有两种主要协议可用访问网络文件系统 : NFS 和CIFS 1 )CIFS: 通用网络文件系统 CIFS 是针对 Microsoft Windows 操作系统的本地网络文件系统Linux 系统可以挂载和访问 CIFS 文件共享 , 如同常见的网络文件系统一样. samba-clie

解决“Word无法访问您试图使用的功能所在的网络位置”问题

解决“Word无法访问您试图使用的功能所在的网络位置”问题 打开Word时出现现现在的对话框,按取消,又可以打开word文档 按取消时,仍然可以打开word文档.为了解决这个问题,我借助网络,知道这是一个word稿纸加载项,有多种解决办法 第一:重新安装 第二:把这个加载项删了.我选择了删除稿纸加载项. 其操作方法如下: 第一步:进入注册表,开始——搜索程序或文件——输入regedit回车进入注册表 第二步:备份注册表:文件——导出——保存(以防修改出错) 第三步:找到加载稿纸项,将其册除. [