sqlite除了能做本地数据库外,可以作为服务器数据库吗?

sqlite除了能做本地数据库外,可以作为服务器数据库吗?,第1张

由于sqlite属于轻量级的数据库,对于处理大批量数据的性能是没有mysql强的,主要运行在手机端,对内存要求很低的设备上,所以不适合当服务器数据库。

SQLite是D.RichardHipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的 *** 作系统上运行。SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。

1. SQLite加载库

百度搜在C#如何使用SQLite,大多的结果会指向System.Data.SQLite的一个下载站,然而由于.net平台互不兼容所以会列出一大堆文件让你选择下载,不知道怎么回事我下了3.5和4.0的二进制dll文件引入后直接dll报错不能使用,改项目平台也一样没用。最后还是VS2019立功,在显示修补方案有一个“System.Data.SQLite”,然后点安装最新版本就给你适配了合适的版本,这个问题就算解决了。

PS再提一下我个人觉得VS2019的NuGet管理包程序并不那么好用,比如我如果直接搜索“System.Data.SQLite”,它会给我看上去一样但肯定适用平台的几十个不一样结果,对我这种萌新来说体验是很糟糕的,完全不知道这玩意适不适用。

2. SQLite数据文件删除

最理想情况下是SQLite直接读取C#资源内的文件,但我没有找到任何API,只能路径去读取数据库文件,那现在的流程就是:打开应用—导出SQLite数据库—连接查询—关闭—删除文件,别问为什么要删除文件,问就是强迫症不允许程序在电脑留下任何纪念品。但万万没想到,无论你什么时候关闭sqlite链接,文件依然是处于被占用的状态,无论你怎么删除就是那么坚挺。万幸我们有谷歌百度,最后找到一个解决方案:在连接Close()后适用GC.Collect()GC.WaitForPendingFinalizers()手动释放内存,之后删除文件就不会提示占用了。

3. ILMerge合并文件

作为一个强迫症患者,我反正不想让一个小应用带上小尾巴,然后生成exe后会依赖两个dll,SQLite.Data.SQLite.dll和SQLite.interop.dll,于是使用ILMerge合并,于是又遇上2个麻烦。ILMerge不支持.net 3.5,我是第一次知道,所以换了4.0然后重新安装System.Data.SQLite,等我重新编译准备合并,然后又提示不能加载文件或程序集“SQLite.Interop.dll”,直接懵圈,ILMerge看上去走不通,只能先把SQLite.Data.SQLite.dll合并掉再取解决SQLite.interop.dll的问题

最后想到一个解决方案,基本和处理SQLite文件一个思路,把SQLite.interop.dll加入项目资源,程序运行时释放到目录下并隐藏,程序关掉时再删除dll

但是dll一旦加载就不像sqlite释放资源就行,所以这里的处理思路是新起一个cmd进程,在延时一段时间(等待程序关闭)后执行删除dll命令,具体命令参照

ping 1.1.1.1 -n 1 -w 1000 >Nul &Del DLLPATH

延时是通过ping来实现的,还有一个小细节,Del命令不能直接删除隐藏文件,所以删除前还要把dll设置为非隐藏


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11596508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存