初识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生成代码

  

DbMetal.exe /database:TestDataContext  /schema /namespace=LinqToSQLite /code=C:\Test.cs /provider=Sqlite  /conn="data source=E:\Working\标准设计器\数据库\data.db3"

 

 

  2、建立数据连接

  

 SQLiteConnection con = new SQLiteConnection(string.Format("dblinqprovider=sqlite;data source={0}", filePath));

 

三、编写自己的业务逻辑吧

 

代码
/// <summary>
        
/// 获取所有定义的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都比较麻烦,简单的方式就是:采用触发器。

 

CREATE TRIGGER [TG_CADEntity_AD] AFTER DELETE ON [main].[T_CADEntity] FOR EACH ROW
BEGIN
delete from T_CADAttribute where CADEntityID=old.ID ;
END

 

四、完成其他工作

 

总结:

  1、Sqlite的数据类型与其他数据库有所区别,需要注意,另外,Sqlite支持无类型字段,在输入数据时,根据输入数据确      定字段类型。如果对于数据类型不了解,可以下载一个GUI工具,利用工具定义表结构时,可以查看到数据类型。具体的GUI工具,我现在也没有觉得哪个特别好用,就暂不推荐了。

  2、SQLite.NET 这个是。NET下开发必须安装的,其实就用到一个dll文件,但是建议完全安装,安装后可以再VS中通过连接服务器的方式,连接到Sqlite数据库文件。

  3、尽量使用数据库自身的特性(如触发器)完成具体的业务需求

posted @ 2011-02-18 11:37  伸手不见五趾  阅读(850)  评论(0编辑  收藏  举报