
C#项目中添加本地数据库我们在日常开发工作中不可避免地使用到数据库这篇文章将介绍一个C# 轻量 ORM 库——SQLite.主要的概念介绍这里就不多说了文章以干货为主。1. 开发工具Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.14.21 (November 2025)2. 安装对应的 NuGet 包1在 Visual Studio 中右键项目 → 管理 NuGet 包2搜索并安装sqlite-net-pcl.3. 建立文件夹建议是新建文件夹将有关数据库的内容保存在一起这样便于管理以下是我的文件结构可以用于参考。其中DatabaseManager.cs存放的是数据库的管理操作UserRepository.cs存放的是对User数据表的管理操作User.cs存放的是User数据表的结构。4. 建立数据表建立数据表的结构也就是Model.以下是我的User.cs文件的内容可以作为参考。usingSQLite;namespaceMy.DatabaseModel{/// summary/// 用户表/// /summary[Table(User)]publicclassUser{[PrimaryKey,AutoIncrement][Column(id)]publicintId{get;set;}[Column(userId)]publicstringDoctorId{get;set;}[Column(avatar)]publicstringAvatar{get;set;}[Column(name)]publicstringName{get;set;}}}1其中 [PrimaryKey, AutoIncrement]表示id是该表的主键数值自增。2userId建议保持唯一性可以根据id变化以下是参考根据id修改后一定要记得更新。// 1️ 插入 UserDb.Insert(user);// 2️ 生成 PatientIduser.UserIdU(10000user.Id);// 3️ 更新 UserDb.Update(user);5. 建立数据库数据库的操作基本上是初始化和销毁两个操作而已。usingMy.DatabaseModel;usingSQLite;namespaceMy.Database{publicclassDatabaseManager{privatestaticSQLiteConnectiondb;privatestaticstringdbPathPath.Combine(AppDomain.CurrentDomain.BaseDirectory,myDatabase.db);publicstaticSQLiteConnectionDB{get{if(dbnull){Init();}returndb;}}publicstaticvoidInit(){// 1 判断数据库是否存在booldbExistsFile.Exists(dbPath);// 2 创建连接dbnewSQLiteConnection(dbPath);if(!dbExists){Console.WriteLine(数据库不存在创建数据库...);// 自动创建表// 用户表db.CreateTableUser();}Console.WriteLine(数据库初始化完成);}/// summary/// 销毁数据库/// /summarypublicstaticvoidDestroyDatabase(){try{//1 关闭数据库连接if(db!null){db.Close();db.Dispose();dbnull;}//2 删除数据库文件if(File.Exists(dbPath)){File.Delete(dbPath);Console.WriteLine(数据库已销毁);}}catch(Exceptionex){Console.WriteLine(删除数据库失败: ex.Message);}}/// summary/// 重置数据库/// /summarypublicstaticvoidResetDatabase(){DestroyDatabase();Init();}}}这里注意销毁数据库时一定要先关闭数据库连接再删除数据库文件。private static string dbPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, myDatabase.db);就是创建数据库文件文件名为“myDatabase.db”.文件名可以自定义的建议根据自己的需求更换具有标识性的文件名建议以Database结尾。6. 增加对数据表的操作我将对数据表的操作以表为单位建立了文件——UserRepository.cs.以下是我的文件内容可以作为参考。usingMy.DatabaseModel;usingSQLite;namespaceRTLAB_MMDS.Database{publicclassUserRepository{privatestaticSQLiteConnectionDbDatabaseManager.DB;/// summary/// 插入数据/// /summary/// param nameuser/param/// returns/returnspublicUserInsertUser(Useruser){Db.Insert(user);returnuser;}/// summary/// 获取全部数据/// /summary/// returns/returnspublicListUserGetAllUsers(){returnDb.TableUser().ToList();}/// summary/// 根据用户id获取数据/// /summary/// param nameuserId/param/// returns/returnspublicUserGetUserByUserId(stringuserId){returnDb.TableUser().FirstOrDefault(dd.UserIduserId);}/// summary/// 根据用户id删除患者/// param nameuserId/param/// /summarypublicvoidDelete(stringuserId){Db.TableUser().Delete(dd.UserIduserId);}/// summary/// 更新用户/// /summarypublicUserUpdate(Useruser){Db.Update(user);returnuser;}}}这种不涉及外键连接和多表组合的数据库操作是比较简单的这里写的也不是很全但是基本逻辑是这样的相对复杂的等会放后面单独讲。还有一个点要注意的是我基本上每一个都写了return实际根据项目情况写就好我这里是为了下面的操作示例写的而已。7. 数据表的操作示例下面就给一个简单的用户表增删改的操作示例。privatevoidexample(){//初始化数据库DatabaseManager.Init();UserRepositoryreponewUserRepository();//创建用户Useruser1newUser{UserId123,Avatar,Name张三,};//插入user1repo.InsertUser(user1);Console.WriteLine(创建用户成功user1.Name);// 查找Useruser2repo.GetUserByUserId(user1.UserId);Console.WriteLine(查找用户成功user2.Name);// 修改user2.Name李四;Useruser3repo.Update(user2);Console.WriteLine(修改用户成功user3.Name);// 删除repo.Delete(user3);Console.WriteLine(删除用户成功);}一定要初始化数据库否则一切操作白搭建议在Program.cs文件中就初始化。好了以上的基本内容就讲完了。每次总结的时候都觉得当初摸索的自己像个傻子囧。下面说一下组合表的事情吧。数据库通常不会只有像上面User这样简单的表一般可能还得存点别的结构而在C#中又不给直接存什么Liststring还有数据比较大的情况下都存一张表检索又影响效率所以下面说一下组合的情况。也是直接通过例子来讲解。8. 组合表的结构usingSQLite;namespaceMy.DatabaseModel{/// summary/// 患者表/// /summary[Table(User)]publicclassUser{[PrimaryKey,AutoIncrement][Column(id)]publicintId{get;set;}[Column(userId)]publicstringDoctorId{get;set;}[Column(avatar)]publicstringAvatar{get;set;}[Column(name)]publicstringName{get;set;}[Ignore]// SQLite-Net 属性告诉它不要映射到表publicListOtherOthers{get;set;}newListOther();}/// summary/// 其他/// /summary[Table(Other)]publicclassOther{[PrimaryKey,AutoIncrement][Column(id)]publicintId{get;set;}[Column(userId)]publicstringUserId{get;set;}[Column(otherName)]publicstringOtherName{get;set;}}}1Other也需要在初始化数据库时创建表即在DatabaseManager.cs中添加db.CreateTableOther();2Other.UserIdUser.userId当然字段名是可以自定义的不过建议相同这样可读性比较高。4ListOther Others我这里存的是List也可以存一条public Other OtherSingle{ get; set; } new Other();如果存的OtherSingle记得修改以下对组合表的操作。9. 对组合表的操作直接上代码吧直观很重要usingMy.DatabaseModel;usingSQLite;namespaceRTLAB_MMDS.Database{publicclassUserRepository{privatestaticSQLiteConnectionDbDatabaseManager.DB;/// summary/// 插入数据/// /summary/// param nameuser/param/// returns/returnspublicUserInsertUser(Useruser){// RunInTransaction是保证数据库操作的原子性// 通俗解释就是RunInTransaction里面的代码只有两个结果全部失败和全部成功Db.RunInTransaction((){// 插入userDb.Insert(user);stringuserIduser.UserId;if(user.others!null){foreach(varotherinuser.Others){other.UserIduserId;// 插入otherDb.Insert(other);}}});returnuser;}/// summary/// 获取全部数据/// /summary/// returns/returnspublicListUserGetAllUsers(){varusersDb.TableUser().ToList();// 把 Other 表按 UserId 分组生成一个可以快速查找的内存索引varotherLookupDb.TableOther().ToList().ToLookup(pp.UserId);foreach(varuserinusers){// 这里就可以根据user.userId直接索引到全部数据啦user.OthersotherLookup[user.userId].ToList();}returnusers;}/// summary/// 根据用户id获取数据/// /summary/// param nameuserId/param/// returns/returnspublicUserGetUserByUserId(stringuserId){varuserDb.TableUser().FirstOrDefault(dd.UserIduserId);if(usernull)returnnull;user.OthersDb.TableOther().Where(pp.UserIduserId).ToList();returnuser;}/// summary/// 根据用户id删除患者/// param nameuserId/param/// /summarypublicvoidDelete(stringuserId){// 先删除子表里的数据Db.TableOther().Delete(aa.UserIduserId);// 再删除主表里的数据Db.TableUser().Delete(dd.UserIduserId);}/// summary/// 更新用户/// /summarypublicUserUpdate(Useruser){Db.Update(user);stringuserIduser.UserId;// 删除旧OtherDb.TableOther().Delete(pp.userIduserId);// 插入新Otherif(user.Others!null){foreach(varotherinuser.Others){other.UserIduserId;Db.Insert(other);}}returnuser;}}}10. 插入组合表这里就简单给一个插入的示例吧其他操作都是相通的。privatevoidexample(){//初始化数据库DatabaseManager.Init();UserRepositoryreponewUserRepository();//创建用户UserusernewUser{UserId123,Avatar,Name张三,};ListOtherothersnewListOther();for(inti0;i;i10){OtherothernewOther();other.OtherName$OtherName_{i};others.Add(other);}user.Otherothers;//插入userrepo.InsertUser(user);Console.WriteLine(创建用户成功user.Name);}11. 结语总结就是啥也不会的时候开头最难等回顾的时候发现好像也就那样。数据库从无到有大致就是这样了。数据量大的情况下比如存了绘图数据有N个点的那种也可以考虑文件存储方式Liststring也可以考虑json存储这就下次遇到再说吧。感谢你看完全文比心