初识Sqlite
这段时间要做一个应用程序配置管理小程序,为公司现有的系统提供统一的配置管理功能。由于和GIS有点关系,需要配置图层、字段等信息。之前打算采用xml作为配置文件,并且已经完成了图层、字段等相关类的编码,序列化与反序列化,修改文件格式与现有的格式匹配等工作。后来觉得,是否可以采用access作为数据库,把数据保存到数据库里,然后实现数据导出模块,根据不同系统的需求,导出成不同的配置文件。于是,开始动手修改。
一、设计数据结构
采用EA,设计了基于Acces的数据表,并在Acces中建立了表结构。
二、编写DA层
之前参与的项目以及自己完成的小程序,使用过Linq,于是,懒惰的我自然又想到了Linq。Linq To Access?查阅了众多资料也没有找到合适的工具,LINQToSQL据说可以支持,但是看到有老外评价“is a lie”,而且不能自动生成类代码。在网上查找资料的过程,看到了很多关于Access和Sqlite的比较,Sqlite以压倒性的优势胜出,而且,之前用过的Dblinq支持sqlite,决定把Access换成Sqlite。
工作重新从一开始
一、设计数据结构
EA中不支持Sqlite,在查阅了Sqlite的数据类型后,手动修改了DDL,找了个Sqlitespy,执行DDL,生成库结构。
二、实现DA层
1、用DBLINQ生成代码
2、建立数据连接
三、编写自己的业务逻辑吧
/// 获取所有定义的CAD图层配置信息
/// </summary>
/// <returns></returns>
public List<Cadlayer> GetCADLayers()
{
return new List<Cadlayer>(dataContext.TcadlAyer.Select(layer => layer));
}
/// <summary>
/// 根据ID获取CAD图层配置信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Cadlayer GetLayerByID(int id)
{
try
{
return this.dataContext.TcadlAyer.Where(layer => (layer.ID == id)).First();
}
catch( Exception ex)
{
throw ex;
}
}
/// <summary>
/// 创建空CAD图层配置信息
/// </summary>
public void CreateNewCADLayer()
{
try
{
this.dataContext.TcadlAyer.InsertOnSubmit(new Cadlayer());
this.dataContext.SubmitChanges();
}
catch(Exception ex)
{
throw ex;
}
}
/// <summary>
/// 删除指定ID的CAD图层配置信息
/// </summary>
/// <param name="id"></param>
public void DeleteCADLayer(int id)
{
try
{
Cadlayer layer = GetLayerByID(id);
if (layer != null)
this.dataContext.TcadlAyer.DeleteOnSubmit(layer);
}
catch (Exception ex)
{
throw ex;
}
}
业务逻辑需要级联删除,如删除一个CAD图层配置信息,该图层对应的属性信息也需要删除,怎么办?无论自己写代码还是使用Linq都比较麻烦,简单的方式就是:采用触发器。
BEGIN
delete from T_CADAttribute where CADEntityID=old.ID ;
END
四、完成其他工作
总结:
1、Sqlite的数据类型与其他数据库有所区别,需要注意,另外,Sqlite支持无类型字段,在输入数据时,根据输入数据确 定字段类型。如果对于数据类型不了解,可以下载一个GUI工具,利用工具定义表结构时,可以查看到数据类型。具体的GUI工具,我现在也没有觉得哪个特别好用,就暂不推荐了。
2、SQLite.NET 这个是。NET下开发必须安装的,其实就用到一个dll文件,但是建议完全安装,安装后可以再VS中通过连接服务器的方式,连接到Sqlite数据库文件。
3、尽量使用数据库自身的特性(如触发器)完成具体的业务需求