C#应用SQlite数据库常见问题汇总
2015-06-18 13:43
253 查看
最近在做SQLite开发,开发环境是VS2010+ SQLite Ado.Net data Provider。这套Data Provider程序是基于System.Data.SQLite 1.0.66版本,下面就总结一下开发SQLite过程中的经验。
VACUUM命令在完成数据清理时采用了和PostgreSQL相同的策略,即创建一个和当前数据库文件相同大小的新数据库文件,之后再将该数据库文件中的数据有组织的导入到新文件中,其中已经删除的数据块将不会被导入,在完成导入后,收缩新数据库文件的尺寸到适当的大小。在SQLite中,仅支持清理当前连接中的主数据库,而不能清理其它Attached数据库。
使用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性能的下降,具体还要根据业务需求来进行取舍。
拷贝引用库。将System.Data.SQLite.dll、System.Data.SQLite.Linq.dll等几个相关dll拷贝到应用程序目录下。
在*.exe.config中,将connection stirng从绝对路径改为相对路径。
在*.exe.config中,添加引用配置信息。
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="data source=DTM.db"" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
相关文章推荐
- 【数据库】mysql的安装
- Oracle之ROW_NUMBER() OVER函数
- 数据库范式
- 迷你mysql操作类
- SQL知识积累——常用函数及特殊字符
- keepalived 实现mysql主从自动切换
- excel数据导入到mysql的问题
- redis安装
- oracle 数据库的一些操作和说明
- SQLite的简单应用
- 在WIN7下安装运行mongodb
- 数据库索引的实现原理
- 创建单例数据库的方法
- MySQL批量去掉某一个字段特定的值
- “无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539) “解决方案
- 谈谈数据库连接池
- oracle字符串处理函数
- MySQL提示Access denied for user ''@'localhost'”的解决
- 深入了解mysql它BDB系列(1)---BDB基础知识
- Ubuntu 下mysql常用的操作语句