.Net SQlite 开发Tips

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

1.程序部署报错

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

  • 将System.Data.SQLite.dll、System.Data.SQLite.Linq.dll等几个相关dll拷贝到应用程序目录下。
  • 将*.exe.config中的connection stirng绝对路径改为相对路径。
  • *.exe.config文件需要添加如下信息:
<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,Culture=neutral, PublicKeyToken=db937bc2d44ff139″ />
    </DbProviderFactories>
  </system.data>

2.数据库清理(VACUUM)

当数据库中的一个或多个数据表存在大量的插入、更新和删除等操作时,将会有大量的磁盘空间被已删除的数据所占用。在没有执行VACUUM命令之前,SQLite并没有将它们归还于操作系统。由于该类数据表中的数据存储非常分散,因此在查询时,无法得到更好的批量IO读取效果,从而影响了查询效率。

VACUUM命令在完成数据清理时采用了和PostgreSQL相同的策略,即创建一个和当前数据库文件相同大小的新数据库文件,之后再将该数据库文件中的数据有组织的导入到新文件中,其中已经删除的数据块将不会被导入,在完成导入后,收缩新数据库文件的尺寸到适当的大小。

在SQLite中,仅支持清理当前连接中的主数据库,而不能清理其它Attached数据库。可以使用VACUUM的方法对sqlite数据库进行清理。

3.外键的Delete Cascade不起作用

使用SQLite Ado.Net data Provider的Designer工具导入*.db文件时,外键的Cascade信息没能正确导入。这时需要在edmx编辑界面手动进行修改。在*.edmx窗口选择连接线,在Property窗口手动修改End1 OnDelete属性为Cascade。修改完成后发现cascade有时生效,有时不生效。这时因为如果*.db库没加载进内存,cascade就不生效。因此,如果希望cascade生效,还要将关联的表手动加载(有点像Hibernate的机制),代码如下:

if(!t1.t11.IsLoaded)
    t1.t11.Load();

这时t1表中的一行删除时,t11表中的相关数据才会跟着被删除。但是这样也造成了SQLite性能的下降,具体还要根据业务需求来进行取舍。

4.Nullable<long> 非空类型

如果在SQLite中不特别设置的话,数字列映射的属性对象是Nullabe型的,需要在数据库中设置为非空。

时间: 2024-11-08 07:12:52

.Net SQlite 开发Tips的相关文章

游戏开发tips之RTTI(1)

首先说明标题的含义,怎么感觉就和定义一种语言一样,需要有一个规约呢..... 标题定义如下:游戏开发tip之+内容+(总tips的第几篇) 扩展如下:内容(一,二,三.....) 新手可怜,大神每一句话也许都藏着干货,但是新手总是不能立马明白(立马理解和明白的话,估计就上升为和大神一样的级别了吧).废话少说,开始正文. 大神说,一个好的游戏引擎应该提供一个好的RTTI.当然,游戏引擎可以自己实现.游戏引擎也可以不实现自己的RTTI,此时需要开发者自己写一套RTTI. 为什么呢? 为什么不用C++

Android开发Tips(2)

欢迎Follow我的GitHub, 关注我的CSDN. 我会介绍关于Android的一些有趣的小知识点. 上一篇. 1. Dagger2的开发顺序 Module -> Component -> Application 首先模块(Module)创建须要提供的类实例, 其次把模块加入到组件(Component)中并提供须要注入的类, 最后把组件加入到应用(Application)中并提供接口. // 模块 @Module public class TestAppModule { private f

学习SQLite之路(五) C/C++ SQLite开发实例

介绍一种乌班图中使用sqlite的用法,非常简单,下面的例子是在乌班图12.04中实现的: 1,先安装两个东西: sudo apt-get install sqlite sqlite3 sudo apt-get install libsqlite3-dev  // 不然可能会报 没有头文件 sqlite3.h 2,C/C++接口:一般用到下面这三个,详情请参考sqlite官方文档. (1)sqlite3_open(const char *filename, sqlite3 **ppDb): 打开

Android开发Tips

欢迎Follow我的GitHub, 关注我的CSDN. 介绍一些, 在Android开发中, 会经常使用的小知识点. 1. Download文件夹 绝对路径 /storage/emulated/0/Download/xxx 遍历 File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File[] files = file.listFiles(); for (int i

iOS开发tips总结

tip 1 :  给UIImage添加毛玻璃效果 func blurImage(value:NSNumber) -> UIImage { let context = CIContext(options:[KCIContextUseSoftwareRenderer:true]) let ciImage = CoreImage.CIImage(image:self) let blurFilter = CIFilter(name:"CIGassianBlur") blurFilter?

SQLite开发工具

Sqlite 管理工具 SQLiteDeveloper及破解 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持,sqlite2,3支持 唯一缺憾,收费,有试用期 下载地址: http://www.sqlitedeveloper.com/ http://www.sqlitedeveloper.com/downloads/SqliteDev385.zip 破解方法: 注册表删除:HKEY_CURRENT_USER\SharpPlus\SqliteDev 下的 StartDate. 或cmd

AE开发tips

1.嵌入式互操作类型 编译的时候出现了一堆警告: 就要改变引用文件的属性:选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型”设置为False. 何为 “嵌入互操作类型” ???     参考1  参考2 1. ”嵌入互操作类型”中的嵌入就是引进.导入的意思,类似于c#中using,c中include的作用,目的是告诉编译器是否要把互操作类型引入. 2. “互操作类型”实际是指一系列Com组件的程序集,是公共运行库中库文件,类似于编译好的类,接口等. 3. “嵌入互操作类型”设定为t

Android开发Tips(3)

欢迎Follow我的GitHub, 关注我的CSDN. 我会介绍关于Android的一些有趣的小知识点. 本文是第三篇, 其余第一篇, 第二篇. 1. UIAutomatorViewer 自动化测试是Android测试的趋势, 稳定\复用, 最常用的工具就是Espresso. 使用UIAutomatorViewer获取资源的Id, 位置/android-sdk/tools/uiautomatorviewer, 点击即可使用. 2. GitHub标签 网址, 比如: 3. 有趣的修改SVG库 地址

wap开发tips

1.overflow-x 这真的是一个大坑,一旦你在body或者html上用了这个属性,对不起,如果你的页面出现滚动条的话,那就会出现莫名其妙的bug,滑动页面的时候fix在顶部或者底部的会挡住. 解决办法:html跟body不要使用这个属性,如果不想让横向出现滚动,就用overflow:hidden;overflow-y:auto; 2.calc() 这个本就是CSS3中的新方法,用起来其实是很爽的,无奈android4.4以下不支持,大家最好别用,除非你不考虑android用户. 3.-we