Sqlite封装 封装有什么用( 二 )


为此,我们需要在BAL中创建一个DBController的类,这个类专门用于sqlite的操作 。
具体代码我已经放到了Gitee上,有兴趣的同学自行获取 。
我收缩了一下代码,大概说下DBController的类

Sqlite封装 封装有什么用

文章插图
DAL项目中需要增加Microsoft.Data.Sqlite的引用,具体方法之前讲过,不重复了 。
两个类变量:
  • _conn是我把数据库连接作为一个类变量了,这样做的目的是让连接一直打开,每次做数据库操作时就不需要再打开了 。有人会说这样不好,没办法并发 。实际一点,我一个单机软件,需要考虑并发吗?
  • LastException记录了最后的异常,一旦有错误发现,我通过这个变量就可以知道发生了哪种错误 。
关于sqlite的操作,我只讲query的函数,其余的就不逐一讲解了,大同小异:
【Sqlite封装 封装有什么用】public List query(string sql){List results = new List();try{if (_conn == null) return results;SqliteCommand command = new SqliteCommand(sql, _conn);SqliteDataReader reader = command.ExecuteReader();while (reader.Read()){Hashtable values = _reader2hash(reader);results.Add(values);}return results;}catch (SqliteException ex){LastException = ex;return results;}}
这里我的返回值用了一个List,List是一个数序列表,Hashtable则是c#中常用的哈希表类,最重要的特性就是可以通过键值直接获取数据,不用像List一样遍历获取,并且Hashtable中可以存取任何类型的值,特别适合数据库这种多样数据类型的字段 。用List这样的类型来承载多组的数据记录非常适合 。当然同学们也可以用其他的如Tuple或者其他自定义类,可以自行尝试,我用这种方式熟练了,就不改了 。
SqliteCommand command = new SqliteCommand(sql, _conn);SqliteDataReader reader = command.ExecuteReader();while (reader.Read()){Hashtable values = _reader2hash(reader);results.Add(values);}
这一段放在一起说,声明一个SqliteCommand实例,然后调用ExecuteReader获取SqliteDataReader的实例,然后循环读取,每读到一条数据就Hashtable,放到返回结果中,继续读取,直到全部读完 。
逻辑很简单,需要说明的是基本上市面上常见的数据库操作都是这个套路,声明xxxCommand,然后执行就好了 。大家也注意到了,所有数据库操作我都加了try...catch,因为数据库存取调用的都是外部设备(数据库文件),比较容易发生各种各样的问题,捕获信息后我们就可以根据具体情况进行处理了 。后面会有章节专门来处理异常信息 。
余下的函数和变量大概简略说一下,同学们自行理解,有不懂的可以评论区留言:
connectToDatabase就是通过文件路径连接数据库;
executeNoReturn是执行SQL,不返回任何结果;
executeHasReturn是执行SQL,返回执行的结果;
hasRecord是执行SQL,判断指定的sql能否返回记录;
query是查询sql,返回所有符合条件的记录;
query_first是查询sql,但仅返回第一条记录;
_reader2hash是私有函数,通过sqlite查询返回的内容是SqliteDataReader;
我都可以预想到,这篇文章如果有键盘侠看到,肯定又会挑这个DBController类的毛病了:
  • 插入效率太低,批量操作不得累死?
  • 多表协同怎么办,不会用事物吗?
  • 安全性太差,不知道sql注入吗?
  • 一直打开数据库,就不怕并发?
  • 我用orm,这些代码根本不用自己写...
如果他们这样说,那也都是对的,因为上面这些问题都是我在以前的项目中实实在在遇到的,可以说上面任何一个点提出来,我也许都可以再写个几万字的专栏 。但我为什么说他们都是键盘侠呢?因为他们只知道喷,都觉得自己比作者要NB,从来都不会认真思考作者为什么要这样写?任何事情都是由一个面的事,既然是面就等于深度*广度,很多人做不好事情,就是这两个方向的度掌握得不好,轻则隔靴挠痒,重则过犹不及 。比如我现在写的这个系列文章是面向新手的,对新手来说基础最重要,所以上面那些我选择性不讲 。我的目标很明确,通过做一个Winform项目实现C#的入门教学,功能持续推进,需要什么添什么,哪里不对改哪里 。正所谓:咬定青山不放松,任尔东西南北风 。
Sqlite封装好之后,我们就可以在此基础上对DAL.Category做接口集成了,如何来完成,我们下节继续 。
----------------------------------------------------
本教程尽量保证2天一更,项目源码已作为开源项目加入到Gitee,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新 。私信: