C#如何从SQLite获取数据库信息生成列表并映射到自定义类对象
C# 从SQLite读取数据映射自定义实体并存储为列表的实现方案
原始问题描述
我正在尝试使用C#从SQLite中获取数据,并将其存入数组或列表中。
当前已定义好的自定义实体类结构:
//class public class DBStudentsInfo { public int uid { get; set; } public string Name { get; set; } public string Number { get; set; } public string[] ManyPoints { get; set; } public string FinalPoint { get; set; } public string Memo { get; set; } public string Grade { get; set; } }
我的核心需求是将数据库查询到的信息映射到上述自定义类的对象中,参考逻辑如下:
数据库存储的单条数据结构示例:
uid: 1, name: "ff", number: "1"……期望的赋值逻辑:
DBStudentInfo information = new DBStudentInfo (); info.Name = ...
请问应当如何实现该需求?
具体实现方法
方法1:原生SQLite驱动手动映射
这是无额外依赖的基础实现方式,先通过NuGet安装Microsoft.Data.Sqlite官方驱动,手动遍历查询结果集完成字段映射。
核心实现代码:
// 替换为你本地的SQLite数据库文件路径 var connStr = $"Data Source=你的数据库文件路径.db"; // 最终存储所有学生对象的列表 var studentList = new List<DBStudentsInfo>(); // 自动释放连接资源 using var conn = new SqliteConnection(connStr); conn.Open(); // 构建查询命令 using var cmd = conn.CreateCommand(); // 替换为你实际的查询SQL、表名和列名 cmd.CommandText = "SELECT uid, name, number, many_points, final_point, memo, grade FROM students"; // 逐行读取查询结果 using var reader = cmd.ExecuteReader(); while (reader.Read()) { var student = new DBStudentsInfo(); // 逐字段取值赋值 student.uid = reader.GetInt32(reader.GetOrdinal("uid")); student.Name = reader.GetString(reader.GetOrdinal("name")); student.Number = reader.GetString(reader.GetOrdinal("number")); // 处理数组类型ManyPoints:SQLite无原生数组列,常规是用分隔符拼接为字符串存储 var manyPointsRaw = reader.GetString(reader.GetOrdinal("many_points")); student.ManyPoints = manyPointsRaw.Split(',', StringSplitOptions.RemoveEmptyEntries); student.FinalPoint = reader.GetString(reader.GetOrdinal("final_point")); // 可能为NULL的字段要先判断,避免抛转换异常 student.Memo = reader.IsDBNull(reader.GetOrdinal("memo")) ? string.Empty : reader.GetString(reader.GetOrdinal("memo")); student.Grade = reader.GetString(reader.GetOrdinal("grade")); studentList.Add(student); }
实现注意事项:
- 映射时数据库列名要和代码里读取的字符串完全匹配,拼写错误会直接触发找不到列的异常
- 所有允许为空的数据库列,必须先通过
reader.IsDBNull()判断空值状态,否则调用GetString()这类强类型转换方法时会抛出转换错误 - 数组、列表这类复杂类型属性,需要根据数据库实际的存储格式做拆分转换,没有办法直接和SQLite列一一对应
方法2:轻量ORM自动映射简化代码
如果不想写重复的逐字段赋值逻辑,可以用Dapper这类轻量ORM组件,安装NuGet包Dapper后,直接通过扩展方法把查询结果自动映射为指定实体类对象,大幅减少样板代码。
简化后的实现代码:
using var conn = new SqliteConnection(connStr); conn.Open(); // 一行代码完成查询、自动实体映射、结果转列表 var studentList = conn.Query<DBStudentsInfo>("SELECT * FROM students").ToList();
注意事项:
- Dapper默认会按照“列名和类属性名完全一致”的规则自动匹配映射,如果列名和属性名不一致,可以在SQL里给列起别名和属性名对齐
- 针对
ManyPoints这类复杂类型属性,可以注册自定义类型转换器,把数据库读取出的分隔字符串自动转换为数组类型,不需要在业务代码里手动拆分。
内容的提问来源于stack exchange,提问作者Alex0315
相关产品推荐
相关产品推荐

