最近在做SQLite开发,开发环境是VS2010+ SQLite Ado.Net data Provider。这套Data Provider程序是基于System.Data.SQLite 1.0.66版本,下面就总结一下开发SQLite过程中的经验。

1.管理工具(Navicat)

sqlite的管理工具很多,我比较喜欢用Navicat。个人建议用Navicat。

2.数据库清理(VACUUM)

当数据库中的一个或多个数据表存在大量的插入、更新和删除等操作时,将会有大量的磁盘空间被已删除的数据所占用。在没有执行VACUUM命令之前,SQLite并没有将它们归还于操作系统。由于该类数据表中的数据存储非常分散,因此在查询时,无法得到更好的批量IO读取效果,从而影响了查询效率。可以使用VACUUM的方法对sqlite数据库进行清理。
 
VACUUM命令在完成数据清理时采用了和PostgreSQL相同的策略,即创建一个和当前数据库文件相同大小的新数据库文件,之后再将该数据库文件中的数据有组织的导入到新文件中,其中已经删除的数据块将不会被导入,在完成导入后,收缩新数据库文件的尺寸到适当的大小。在SQLite中,仅支持清理当前连接中的主数据库,而不能清理其它Attached数据库。
SQLiteConnection sqlconn = new SQLiteConnection(@"Data Source=C:\cache;Version=3;Password=123");
sqlconn.Open();
SQLiteCommand sqlCom = sqlconn.CreateCommand();
sqlCom.CommandText = "VACUUM";
sqlCom.ExecuteNonQuery();

3.非空类型(Nullable<long>)

 SQLite中的列映射到实体对象属性时,默认是Nullabe型的。而Nullable型数据开发比较麻烦,为了避免这个问题,可在数据库中将列设置为非空。

4.外键的Delete Cascade不起作用

产生这个问题主要有两个原因,有可能是在edmx中cascade设置没被创建,也有可能是程序运行时数据库对象没加载到内存。

  • 使用SQLite Ado.Net data Provider的Designer工具导入*.db文件时,外键的Cascade信息没能正确导入,这个可能是Provider的BUG。这时需要在edmx编辑界面手动进行修改。在*.edmx窗口选择连接线,在Property窗口手动修改End1 OnDelete属性为Cascade。
  • 就算在edmx中设置正确,还是会发现cascade有时生效,有时不生效。这时因为如果*.db库中的数据如果没加载进内存,cascade就不生效。因此,如果希望cascade生效,还要将关联的表手动加载(有点像Hibernate的懒加载机制)。这时t1表中的一行删除时,t11表中的相关数据才会跟着被删除,代码如下。但是这样也造成了SQLite性能的下降,具体还要根据业务需求来进行取舍。
if(!t1.t11.IsLoaded)
t1.t11.Load();

5.程序部署报错

因为SQLite Ado.Net data Provider会将常用dll注册到GAC,所以在本机运行时一般不会有问题,但是部署到别的机器就会报错。这时需要做三个操作:

  • 拷贝引用库。将System.Data.SQLite.dll、System.Data.SQLite.Linq.dll等几个相关dll拷贝到应用程序目录下。
  • 在*.exe.config中,将connection stirng从绝对路径改为相对路径。
  • 在*.exe.config中,添加引用配置信息。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="DTMEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SQLite;provider connection string=&quot;data source=DTM.db&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>

C#调用SQlite常见问题汇总的更多相关文章

  1. H5项目常见问题汇总及解决方案

    H5项目常见问题汇总及解决方案 H5   2015-12-06 10:15:33 发布 您的评价:       4.5   收藏     4收藏 H5项目常见问题及注意事项 Meta基础知识: H5页 ...

  2. MVC 网站部署常见问题汇总

    一:TGIShare项目是一个MVC5的网站程序,部署在了IIS上,使用的Windows验证方式,并在本机设置了计划任务定时调用某个地址执行命令.问题汇总如下: 1.Window Server 200 ...

  3. 集成 jpush-react-native 常见问题汇总 (iOS 篇)

    给 iOS 应用添加推送功能是一件比较麻烦的事情,本篇文章收集了集成 jpush-react-native 的常见问题,目的是为了帮助用户更好地排查问题 1. 收不到推送 确保是在真机上测试,而不是在 ...

  4. H5 常见问题汇总及解决方案

    原文链接:http://mp.weixin.qq.com/s/JVUpsz9QHsNV0_7U-3HCMg H5 项目常见问题汇总及解决方案 -- 由钟平勇分享 转自 https://github.c ...

  5. Nuxt.js的踩坑指南(常见问题汇总)

    本文会不定期更新在nuxt.js中遇到的问题进行汇总.转发请注明出处,尊重作者,谢谢! 强烈推荐作者文档版踩坑指南,点击跳转踩坑指南 在Nuxt的官方文档中,中文文档和英文文档都存在着不小的差异. 1 ...

  6. CentOS安装Oracle数据库详细介绍及常见问题汇总

    一.安装前准备 1.软件硬件要求 操作系统:CentOS 6.4(32bit)Oracle数据库版本:Oracle 10g(10201_database_linux32.zip)最小内存:1G(检查命 ...

  7. SVN集中式版本控制器的安装、使用与常见问题汇总

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,集中式版本控制器 官方网站:https://www.visualsvn.com/ 下载右边的服务器端,左边的客 ...

  8. Installshield脚本拷贝文件常见问题汇总

    原文:Installshield脚本拷贝文件常见问题汇总 很多朋友经常来问:为什么我用CopyFile/XCopyFile函数拷贝文件无效?引起这种情况的原因有很多,今天略微总结了一下,欢迎各位朋友跟 ...

  9. J2EE进阶(十)SSH框架整合常见问题汇总(一)

    SSH框架整合常见问题汇总(一) 前言 以下所列问题具有针对性,但是遇到同类型问题时均可按照此思路进行解决. HTTP Status 404 - No result defined for actio ...

随机推荐

  1. js 弹性导航

    <style> *{margin:0;padding:0;} #box{height:50px;float:left;position:relative;background:#f90;} ...

  2. FJOI2019 游记[大概是考完会解封?]

    Day -1 不知不觉就快省选了啊...从NOIP的爆炸到现在也已经过了两个月了啊... 因为高一没有封闭[划] 所以这些内容是翘了课[划]在机房写的 嘛...感觉自己还有好多东西不会啊……这两天一直 ...

  3. windows下几个方便的右键菜单

    一直在用,拷来拷去麻烦,贴这里方便自己方便大家 PSHere.reg 右键菜单打开powershell Windows Registry Editor Version 5.00 [HKEY_CLASS ...

  4. .net core webapi 使用过滤器。

    过滤器一般用于权限校验.日志处理... 一:ActionFilterAttribute过滤器. 1:建一个类,继承于ActionFilterAttribute抽象类. public class Log ...

  5. Universal-Image-Loader完全解析(下)

    Universal-Image-Loader完全解析(下) 在这篇文章中,我会继续跟大家分享有关于Universal-Image-Loader框架的相关知识,这次主要分享的是框架中图片缓存方面的知识. ...

  6. Java Web入门学习(二) Eclipse的配置

    Java Web学习(二) Eclipse的配置 一.下载Eclipse 1.进入Eclipse官网,进行下载 上图,下载Eclipse IDE for JaveEE Developers 版本,然后 ...

  7. ubuntu安装ntp时间服务器

    1.安装ntp软件 sudo apt-get install ntp2.修改配置文件      sudo vim /etc/ntp.conf driftfile /var/lib/ntp/ntp.dr ...

  8. Android多媒体之view,SurfaceView,GLSurfaceView

    1.相关概念 不用画布,直接在窗口上进行绘图叫做无缓冲绘图. 用了一个画布,将所有内容都先画到画布上,在整体绘制到窗口上,就该叫做单缓冲绘图, 那个画布就是一个缓冲区.用了两个画布,一个进行临时的绘图 ...

  9. centos6 vps部署rails

    centos 6 vps初始化部署rails应用1 ssh登录 vpsssh -p port root@server_ip_address 2 添加用户 adduser usernamepasswd ...

  10. CentOS 6.4下安装 Mono 3.2 和Jexus 5.4

    1.安装Mono源码安装需要的库 yum -y install gcc gcc-c++ bison pkgconfig glib2-devel gettext make libpng-devel li ...