一个.Net开发的轻量级SQLite数据库ORM

SQLite是一种流行的开源关系型数据库,它的设计目标是提供轻量级、高效、可靠和易用的数据存储服务。由于SQLite无需单独的服务器进程,它通常被用于嵌入式系统和单机应用程序中,也可以用于网络应用程序的辅助数据库。

今天给大家推荐一个.NET开发的 SQLite ORMSQLite-net,非常好用,性能也很棒!

关于 SQLite-net

SQLite-net 是一个快速、便捷的数据库层。它的设计遵循以下目标:

  • 非常易于与现有项目集成,并且可以在所有 .NET 平台上运行。
  • 快速高效,对SQLite没有任何性能上的影响
  • 参数化执行CRUD 操作和查询,从而无需担心 SQL 注入等安全问题。
  • SQLite-net 使用一个小型反射驱动的 ORM 层,所以无需对当前使用的实体类进行任何重大更改。

安装SQLite-net

.NET CLI方式:

bash 复制代码
dotnet add package sqlite-net-pcl

Package Manager方式:

csharp 复制代码
Install-Package sqlite-net-pcl

定义实体类:

csharp 复制代码
public class User
{
	[PrimaryKey, AutoIncrement]
	public int Id { get; set; }
	public string Name { get; set; }
}

SQLite-net 提供两种 API 来执行数据库操作:同步 API 和异步 API。同步 API 会阻塞当前线程,直到数据库操作完成。异步 API 不会阻塞当前线程,而是允许线程继续执行其他任务,直到数据库操作完成。

同步API使用:

csharp 复制代码
// Get an absolute path to the database file
var databasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyData.db");

var db = new SQLiteConnection(databasePath);
db.CreateTable<User>();

上面代码可以创建在数据库中,自动创建表User

添加、更新和删除

csharp 复制代码
using (var db = new SQLiteConnection("MyData.db")) {
    // 添加
    var user = new User { Name = "张三" };
    db.Insert(user);

    // 读取
    var users = db.Table<User>().ToList();

    // 更新
    var userToUpdate = db.Get<User>(1); 
    userToUpdate.Name = "张三222";
    db.Update(userToUpdate);

    // 删除
    var userToDelete = db.Get<User>(2); 
    db.Delete(userToDelete);
}

使用SQL 执行命令和查询

csharp 复制代码
db.Execute ("insert into User(Name) values (?)", "李四");
var user_model = db.Query<User> ("select * from User where Id=?",3);

异步API使用

与同步API使用类似

csharp 复制代码
using (var db = new SQLiteConnection("MyData.db")) {
	//创建表
	await db.CreateTableAsync<User>();
    // 添加
    await db.InsertAsync(new User { Name = "张三" });

    // 查询
    var users = await db.Table<User>().ToListAsync();

    // 更新
    var userToUpdate = await db.GetAsync<User>(1); 
    userToUpdate.Name = "张三222";
    await db.UpdateAsync(userToUpdate);

    // 删除
    var userToDelete = await db.GetAsync<User>(2); 
    await db.DeleteAsync(userToDelete);
}

加密支持

加密一直是 SQLite 的一个重要问题,数据库加密在一定程度上可以保护数据,防止其他人直接访问数据库。SQLite-net 可以通过 sqlite-net-sqlcipher加密数据库

sqlite-net-sqlcipher包安装:

.NET CLI方式

bash 复制代码
dotnet add package sqlite-net-sqlcipher

Package Manager方式

csharp 复制代码
Install-Package sqlite-net-sqlcipher

安装完成后,在连接数据库的时候, 密码需要在传递给连接构造函数时设置。

csharp 复制代码
var options = new SQLiteConnectionString(databasePath, true,
	key: "password");
var encryptedDb = new SQLiteAsyncConnection(options);

如果需要设置加密 pragma,可以将操作传递给连接字符串。

csharp 复制代码
var options2 = new SQLiteConnectionString (databasePath, true,
	key: "password",
	preKeyAction: db => db.Execute("PRAGMA cipher_default_use_hmac = OFF;"),
	postKeyAction: db => db.Execute ("PRAGMA kdf_iter = 128000;"));
var encryptedDb2 = new SQLiteAsyncConnection (options2);

sqlite-net代码地址:https://github.com/praeclarum/sqlite-net

相关推荐
唐青枫3 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
兵慌码乱4 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
唐青枫4 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
Caco_D5 天前
一行代码抓遍全网 20 个热榜!Aneiang.Pa 4.0 发布 — 极简 .NET 爬虫库
爬虫·.net
咕白m6255 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
兵慌码乱5 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
小码编匠5 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫7 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
2601_9620725510 天前
李梦娇常识4600问|题库|打印版
sql·华为od·华为·c#·华为云·.net·harmonyos