.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版:
下载
转载请注明出处:原文http://www.cnblogs.com/yangzhj/p/4230123.html
(全文完)
-------------------------------------------
2015-01-17 10:45 PS:
发现之前提供的下载库x86版本编译有些问题。现已重新编译,且SQLite.Interop.dll均编译为静态链接,方便迁移使用。谢谢。
.Net版SQLite无法访问网络位置的数据库文件-winOpen,os_win.c 36702异常的更多相关文章
- AutoCAD 2007在win8.1安装出现——错误1606。无法访问网络位置Autodesk\AutoCAD2007\R17.0\chs\的解决
环境win 8.1 64位,AutoCAD 2007 安装CAD2007,一开始安装就出错,提示:错误1606.无法访问网络位置Autodesk\AutoCAD2007\R17.0\chs\ 百度之后 ...
- Winform安装包出现无法访问网络位置
1.原因:安装包的安装路径出现了问题 2.如下图:错误路径 3.如下图:正确路径
- ASP.NET访问网络映射盘&实现文件上传读取功能
最近在改Web的时候,遇到一个问题,要跨机器访问共享文件夹,以实现文件正常上传下载功能. 要实现该功能,可以采用HTTP的方式,也可以使用网络映射磁盘的方式,今天主要给大家分享一下使用网络映射磁盘的方 ...
- sqlite 修改表名,合并数据库(文件)
修改表名:ALTER TABLE orig_table_name RENAME TO tmp_table_name; 将某个数据库的一个表的数据插入到另一个数据库的某个表里:1.先连接数据库A2.再a ...
- 【转】Phonegap离线调用SQLite数据库文件
按:不可多得的好文章,转过来以免源丢失 文章来源:http://liuwei.co/index.php/default/The-quickest-way-to-execute-many-sql-for ...
- 解决“Word无法访问您试图使用的功能所在的网络位置”问题
解决“Word无法访问您试图使用的功能所在的网络位置”问题 打开Word时出现现现在的对话框,按取消,又可以打开word文档 按取消时,仍然可以打开word文档.为了解决这个问题,我借助网络,知道这是 ...
- matlab安装出现“无法访问所在网络位置”的正确解决办法
今天安装matlab时出现了如下错误:无法访问您试图使用的功能所在的网络位置,单击"确认"重试或者在下面输入包含"vcredist.msc"的文件夹路径. (由 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
- HttpConnection方式访问网络
参考疯狂android讲义,重点在于学习1.HttpConnection访问网络2.多线程下载文件的处理 主activity: package com.example.multithreaddownl ...
随机推荐
- 利用SimpleHttpServer+urllib传文件
1.服务器 利用SimpleHTTPServer,命令行运行 python -m SimpleHTTPServer 2.客户端 利用urllib等,方法有3个 import urllib print ...
- gdb各种调试命令和技巧
陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...
- 微信小程序组件swiper
视图容器swiper:官方文档 Demo Code Page({ data:{ imgUrls: [ 'http://img02.tooopen.com/images/20150928/tooopen ...
- Servlet Rest
http://www.blogjava.net/yongboy/archive/2010/10/01/333609.html
- Keepalived 服务器状态监测
keepalived简介: keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层.第4层和第5层交换.Keepalived的作用是检测web服务器 ...
- html 基础 超链接
***设置超链接的样式示例 a:link 超链接被点前状态 a:visited 超链接点击后状态 a:hover 悬停在超链接时 a:active 点击超链接时 在定义这些状态时,有一个顺序l v ...
- Kotlin学习记录3
参考我的博客:http://www.isedwardtang.com/2017/09/04/kotlin-primer-3/
- 【leetcode刷题笔记】Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- ubuntu 刚更改默认python3版本后更新包等
一般来说ubuntu 刚更改为python3为默认版本后要进行一下更新包等等的内容(当然不更新一下也是可以的,最好更新一下,第一次更新较慢) 使用下面两行代码: sudo apt-get update ...
- Django如何把数据库里的html格式输出到前端
只需在HTML页面中加入{% autoescape off %}即可! {% autoescape off %} 需要显示的数据 (% endautoescap %}