zoukankan      html  css  js  c++  java
  • 记一次C#使用SQLite的坑

    准备做一个数据查询小工具,由于数据都是固定的,所以其实就是做一个Windows的数据界面展示软件。决定用SQLite和C#搞定,数据库方面比较熟也没遇上什么问题,就略过不表,记几个C#的坑吧

    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设置为非隐藏

    虽然工具的思路和代码都很简单,但一波三折愣是花了一下午,谨以此碎碎念铭记我逝去的青春

  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/lazyfish007/p/12714848.html
Copyright © 2011-2022 走看看