初识Sqlite

it2022-05-05  94

  这段时间要做一个应用程序配置管理小程序,为公司现有的系统提供统一的配置管理功能。由于和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、尽量使用数据库自身的特性(如触发器)完成具体的业务需求

转载于:https://www.cnblogs.com/ITGIS/articles/1957655.html

相关资源:各显卡算力对照表!

最新回复(0)