上一篇
如何用C将类数据高效存储至SQLite数据库?
- 行业动态
- 2025-05-14
- 5
在C#中通过ORM框架(如Entity Framework或Dapper)将类对象存储到SQLite数据库,需定义实体类与数据表结构映射,配置数据库连接,并实现增删改查操作,SQLite作为轻量级嵌入式数据库,适用于本地数据存储,结合C#可实现高效的类对象持久化方案。
环境配置与依赖库安装
安装NuGet包
通过Visual Studio的NuGet包管理器安装以下库:Microsoft.Data.Sqlite
:微软官方提供的轻量级SQLite操作库System.Data.Common
:支持基础数据库操作
命令:
Install-Package Microsoft.Data.Sqlite
引用命名空间
using Microsoft.Data.Sqlite; using System.Data;
定义实体类
假设需要存储用户信息,先创建对应类:
public class User { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public DateTime RegisterTime { get; set; } }
关键点:
- 属性名称与数据库字段建议保持一致(可通过
[Column("字段名")]
自定义映射) - 推荐为类添加无参构造函数,避免ORM映射异常
创建数据库与连接
// 连接字符串(数据库文件不存在时会自动创建) string connectionString = "Data Source=users.db"; using var connection = new SqliteConnection(connectionString); connection.Open();
路径说明:
- 绝对路径:
Data Source=C:/data/users.db
- 相对路径:
Data Source=./AppData/users.db
- 内存数据库:
Data Source=:memory:
(仅临时存储)
创建数据表
string createTableSql = @" CREATE TABLE IF NOT EXISTS Users ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL, Email TEXT UNIQUE, RegisterTime DATETIME DEFAULT CURRENT_TIMESTAMP )"; using var command = new SqliteCommand(createTableSql, connection); command.ExecuteNonQuery();
字段类型对照:
| C#类型 | SQLite类型 |
|—————–|————-|
| int/long | INTEGER |
| string | TEXT |
| DateTime | DATETIME |
| bool | BOOLEAN |
实现CRUD操作
插入数据
public void InsertUser(User user) { string sql = @"INSERT INTO Users (Name, Email) VALUES (@name, @email)"; using var command = new SqliteCommand(sql, connection); command.Parameters.AddWithValue("@name", user.Name); command.Parameters.AddWithValue("@email", user.Email); command.ExecuteNonQuery(); // 获取自增ID user.Id = (int)connection.LastInsertRowId; }
查询数据
public User GetUserById(int id) { string sql = "SELECT * FROM Users WHERE Id = @id"; using var command = new SqliteCommand(sql, connection); command.Parameters.AddWithValue("@id", id); using var reader = command.ExecuteReader(); if (reader.Read()) { return new User { Id = reader.GetInt32(0), Name = reader.GetString(1), Email = reader.GetString(2), RegisterTime = reader.GetDateTime(3) }; } return null; }
更新数据
public void UpdateUserEmail(int id, string newEmail) { string sql = "UPDATE Users SET Email = @email WHERE Id = @id"; using var command = new SqliteCommand(sql, connection); command.Parameters.AddWithValue("@email", newEmail); command.Parameters.AddWithValue("@id", id); command.ExecuteNonQuery(); }
删除数据
public void DeleteUser(int id) { string sql = "DELETE FROM Users WHERE Id = @id"; using var command = new SqliteCommand(sql, connection); command.Parameters.AddWithValue("@id", id); command.ExecuteNonQuery(); }
事务处理
using var transaction = connection.BeginTransaction(); try { // 执行多个操作 InsertUser(user1); UpdateUserEmail(2, "new@example.com"); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); // 记录日志 }
异常处理建议
捕获特定异常类型:
try { // 数据库操作 } catch (SqliteException ex) { // 处理主键冲突、连接失败等 } catch (InvalidOperationException ex) { // 处理连接状态错误 }
建议记录完整日志,包含:
- 执行的SQL语句
- 错误代码(
ex.SqliteErrorCode
) - 堆栈跟踪信息
性能优化策略
连接池优化
// 在连接字符串中添加池化配置 string connectionString = "Data Source=users.db;Pooling=True;Max Pool Size=100";
索引优化
CREATE INDEX idx_users_email ON Users(Email);
批量操作
使用参数化查询批量插入数据,减少解析开销。异步操作
public async Task InsertUserAsync(User user) { using var command = new SqliteCommand(sql, connection); await command.ExecuteNonQueryAsync(); }
数据库维护
定期执行VACUUM
命令整理碎片:new SqliteCommand("VACUUM", connection).ExecuteNonQuery();
扩展建议
使用ORM框架
如需简化操作,可采用Dapper或Entity Framework Core:- Dapper示例:
connection.Execute("INSERT INTO Users (...) VALUES (...)", user);
- Dapper示例:
加密数据库
通过SQLCipher扩展实现数据库加密:string connectionString = "Data Source=encrypted.db;Password=MySecretKey";
跨平台部署
SQLite支持Windows/Linux/macOS,需确保目标系统有SQLite.Interop.dll
依赖项。
引用说明
本文代码示例基于Microsoft.Data.Sqlite 7.0官方文档实现,SQLite语法参考自SQLite官方规范(2025版),性能优化策略参考数据库优化白皮书及Stack Overflow社区最佳实践。