为此,我们需要在BAL中创建一个DBController的类,这个类专门用于sqlite的操作 。
具体代码我已经放到了Gitee上,有兴趣的同学自行获取 。
我收缩了一下代码,大概说下DBController的类
文章插图
DAL项目中需要增加Microsoft.Data.Sqlite的引用,具体方法之前讲过,不重复了 。
两个类变量:
- _conn是我把数据库连接作为一个类变量了,这样做的目的是让连接一直打开,每次做数据库操作时就不需要再打开了 。有人会说这样不好,没办法并发 。实际一点,我一个单机软件,需要考虑并发吗?
- LastException记录了最后的异常,一旦有错误发现,我通过这个变量就可以知道发生了哪种错误 。
【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,这些代码根本不用自己写...
Sqlite封装好之后,我们就可以在此基础上对DAL.Category做接口集成了,如何来完成,我们下节继续 。
----------------------------------------------------
本教程尽量保证2天一更,项目源码已作为开源项目加入到Gitee,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新 。私信:
- 当年,傅艺伟在拍封神榜时,拒绝和纣王扮演者达奇老师拍吻戏,为了这件事
- 2015年,向华强投5亿拍封神传奇,为了捧儿子向佐,出5000万请李连杰
- 2022怀化疫情什么时候解封| 2022怀化疫情什么时候解封
- 五一全国能解封吗?本轮新冠疫情还要持续多久| 五一全国能解封吗?本轮新冠疫情还要持续多久
- 清零后14天解封还是28天解封| 清零后14天解封还是28天解封
- 疫情清零后多少天解封| 疫情清零后多少天解封
- 给常用iPhone玩游戏的同学安利一个神级游戏配件——黑鲨冰封散热背夹系列
- 央视315晚会曝光机械表因消磁走时不准 ,名表维修中心小病大修,原封未动
- 【游戏世界】《王者荣耀》拉塔恩封印星辰与其说的4件事告诉你答案
- 抖音朋友圈封面相册怎么弄视频 抖音朋友圈封面相册做动态视频教程