C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布
一:让 SQLiteExpert 支持(cipher)加密数据库
SQLiteExpert 作为SQlite 的管理工具,默认不支持加密数据库的,使其成为支持(cipher)加密数据库的管理工具,需要添加e_sqlcipher.dll (复制到SQLiteExpertPro32/64.exe 同级目录即可,从哪里来的这个问题:你可以直接往后面下载链接下,也可以跟随文章知道从哪里来的。最好是知道从哪里来的,也许我放链接的版本在未来有新版本更替,我也就不更新下载链接了。),并在其设置里面进行勾选就能激活加密数据库支持。如下图所示(几个关键点已经标记),需要注意的是SQLiteExpert 32位/64位需要与e_sqlcipher.dll 32位/64位匹配,否则在32位版的SQLiteExpert 是看不到64位的e_sqlcipher.dll。
加入成功后,打开或者新建数据库都有加密选项

(新建数据库)

(打开加密数据库)
这样到此可以完整的处理了SQLiteExpert 支持加密
由于SQLiteExpert 只有windows 版本,linux 平台的cipher加密支持库也就不打包了。对于跨平台的SQLite gui 也许类似,上传的压缩包就只有windows平台dll。
下载链接在顶部,压缩包结构如下:

二. .Net C# 连接(cipher)加密的SQlite数据库
nuget
1、SQLitePCLRaw.bundle_e_sqlcipher
2、Microsoft.Data.Sqlite
3、Costura.Fody (如果不需要考虑发布洁癖(单文件,全部外围DLL聚合),就没必要。)
直接debug,生成一堆内容,我随便建立了个VS 工程(sqlitedemo) debug目录大致如下:

runtime 内容如下:(也就是各种平台的(cipher)sqlite lib),前面的e_sqlcipher.dll取材就是从这里取得。

debug 生成的很多,也就是刚才说的发布生成洁癖的问题,如果你在意,发布时候选择输出好平台,runtime可以自动减少,但是依旧会生成其他dll。
那就采用Costura.Fody
编辑项目内 FodyWeavers.xml 文件(nuget过了会自动生成该文件),文件内容修改如下:
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"><Costura ><Unmanaged64Assemblies>e_sqlciphere_sqlite3</Unmanaged64Assemblies><Unmanaged32Assemblies>e_sqlciphere_sqlite3</Unmanaged32Assemblies></Costura>
</Weavers>
再编辑 解决方案文件(右边第一箭头那里双击)

主要语句加入 (我选择的x64版本的Exe)
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
这样,右键点击 解决方案->重新生成解决方案 (这里要注意,要重新整个解决方案才行。更改解决方案文件,直接debug会有问题。)
最终生成输出内容如下:

其他乱七八糟的dll没有了,清爽吧?!
再来看相关C# 连接Sqlite 操作的代码:先上SqliteHelper,顺便也推荐一下 Cody AI生成的,我用了很长时间,免费且好用(面向编程)。
public class SQLiteHelper{private readonly string _connectionString;public SQLiteHelper(string dbPath, string password = null){var builder = new SqliteConnectionStringBuilder{DataSource = dbPath,Mode = SqliteOpenMode.ReadWriteCreate};if (!string.IsNullOrEmpty(password)){builder.Password = password;}_connectionString = builder.ConnectionString;}public int ExecuteNonQuery(string sql, List<SqliteParameter> parameters = null){using (var connection = new SqliteConnection(_connectionString)){connection.Open();using (var command = connection.CreateCommand()){command.CommandText = sql;if (parameters != null){command.Parameters.AddRange(parameters);}return command.ExecuteNonQuery();}}}public T ExecuteScalar<T>(string sql, List<SqliteParameter> parameters = null){using (var connection = new SqliteConnection(_connectionString)){connection.Open();using (var command = connection.CreateCommand()){command.CommandText = sql;if (parameters != null){command.Parameters.AddRange(parameters);}var result = command.ExecuteScalar();return (T)Convert.ChangeType(result, typeof(T));}}}public List<T> ExecuteQuery<T>(string sql, List<SqliteParameter> parameters = null) where T : new(){var result = new List<T>();using (var connection = new SqliteConnection(_connectionString)){connection.Open();using (var command = connection.CreateCommand()){command.CommandText = sql;if (parameters != null){command.Parameters.AddRange(parameters);}using (var reader = command.ExecuteReader()){while (reader.Read()){var item = new T();for (int i = 0; i < reader.FieldCount; i++){var property = typeof(T).GetProperty(reader.GetName(i), BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);if (property != null && !reader.IsDBNull(i)){property.SetValue(item, Convert.ChangeType(reader.GetValue(i), property.PropertyType));}}result.Add(item);}}}}return result;}public void ExecuteTransaction(Action<SqliteConnection> action){using (var connection = new SqliteConnection(_connectionString)){connection.Open();using (var transaction = connection.BeginTransaction()){try{action(connection);transaction.Commit();}catch{transaction.Rollback();throw;}}}}}
}
调用如下:
SQLiteHelper 构造函数,第一个参数数据库路径文件全名,第二个参数数据库密码
SQLiteHelper SLH = new SQLiteHelper("D:\\Manage\\Documents\\db", "TEST");const int batchSize = 100000;const string insertSql = "INSERT INTO Student (F_ID, F_Name) VALUES (@F_ID, @F_Name)";SLH.ExecuteTransaction(connection =>{using var command = connection.CreateCommand();command.CommandText = insertSql;command.Parameters.Add("@F_ID", SqliteType.Text);command.Parameters.Add("@F_Name", SqliteType.Text);for (int i = 0; i < batchSize; i++){command.Parameters["@F_ID"].Value = Guid.NewGuid().ToString();command.Parameters["@F_Name"].Value = $"John{i}";command.ExecuteNonQuery();}});
密码错误则在这里报错:

这样既可以C# 开发加密数据库又可以在外部用外部工具直接编辑加密数据库的环境就达成了。
后话:
选择SQLiteExpert 是界面要黑一点,可能不是最好用的,但黑色看起来眼睛舒服一点,欢迎推荐一些。
相关文章:
C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布
一:让 SQLiteExpert 支持(cipher)加密数据库 SQLiteExpert 作为SQlite 的管理工具,默认不支持加密数据库的,使其成为支持(cipher)加密数据库的管理工具,需要添加e_sqlcipher.dll &…...
MySQL 8.0 新特性之自增变量持久化
MySQL 8.0 新特性之自增变量持久化 文章目录 MySQL 8.0 新特性之自增变量持久化MySQL 5.7 vs 8.0 测试对比MySQL 5.7MySQL 8.0 参考资料 MySQL 8.0 中支持自增变量持久化,实际也是解决之前版本中存在的自增主键重启重置的 BUG 问题( BUG #199࿱…...
网站建设公司哪家好?好的网站建设公司应该有哪些特别之处?
面对众多的网站建设公司,企业该如何选择呢?如何才能避坑呢?本文将探讨好的网站建设公司应该具备的特别之处 案例,这是最直观的表现,一个好的网站建设公司必然拥有为数众多的的案例展示,且这些案例质量高&a…...
香山南湖架构分析--FE
总体架构 分支预测和指令缓存,通过FTQ达到解耦的目的;FTQ将请求送给ICache,进行取指;取出的指令码通过预译码初步检查分支预测的错误并及时冲刷预测流水线;检查后的指令送入指令缓冲并传给译码模块,最终形成后端的指令…...
【Linux的那些事】shell命名及Linux权限的理解
目录 一、shell命令以及运行原理 二、Linux权限的概念 三、Linux权限管理 3.1.文件访问者的分类(人) 3.2.文件类型和访问权限(事物属性) 3.3.文件权限值的表示方法 3.4.文件访问权限的相关设置方法 a)chmod b)chown c)…...
Visual Studio 2022 配置 Boost 库
一、使用预编译版本 尽量不要使用预编译版本,因为可能构建的不完全,还得重新构建,不如一步到位 1. 下载预编译的 Boost 库 下载:Boost C Libraries - Browse /boost-binaries at SourceForge.net 2. 选择 msvc 版本࿰…...
逻辑回归(下): Sigmoid 函数的发展历史
背景 闲来无事翻了一下之前买的一个机器学习课程及之前记录的网络笔记,发现遇到公式都是截图,甚至是在纸上用笔推导的。重新整理一遍之前逻辑回归函数的学习笔记,主要是为了玩一下 LaTex 语法,写公式挺有意思的。 整理之前三篇笔…...
快速理解mQ(三)——RabbitMQ 各种交换机的区别与应用
RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP),允许应用程序或系统以异步的方式交换数据。RabbitMQ中的交换机(Exchange)是消息的分发中心,它接收来自生产者的消息…...
【五分钟学会】YOLO11 自定义数据集从训练到部署
数据集地址 数据集包含 360 张红血细胞图像及其注释文件,分为训练集与验证集。训练文件夹包含 300 张带有注释的图像。测试和验证文件夹都包含 60 张带有注释的图像。我们对原始数据集进行了一些修改以准备此 CBC 数据集,并将数据集分成三部分。在360张…...
Redis学习(十二)连接数不足报错及分析修复:ERR max number of clients reached.
目录 一、问题介绍二、问题分析2.1 redis-cli 登录2.2 info clients 查看连接数情况2.3 client list 查看具体连接情况2.4 分析连接空闲时长2.5 client list 根据客户端IP统计连接数 三、问题结论和解决3.1 问题结论:3.2 解决方案①:优化程序3.3 解决方案…...
八股文面试题总结(包含主流的面试经典题)
Java基础 1、JDK和JRE的区别是什么** JDK是Java开发工具包,JRE是Java运行时环境,二者的区别在于 JRE是Java程序运行所必须的,它包含jvm和一些Java的基础类库 JDK是Java程序开发所必须的,它包含JRE和一些开发工具 总结一下就是…...
一分钟掌握 Java22 新特性
1. 增强的模式匹配(Pattern Matching for Switch) Java 22 扩展了模式匹配的功能,允许在 switch 语句中使用模式匹配,从而使代码更加简洁和易读。 示例代码: public class PatternMatchingSwitchDemo {public stati…...
西安凭借入驻企业展示科技“硬”实力的数字媒体产业园
在古城西安的怀抱中,一座以科技“硬”实力为核心竞争力的数字媒体产业园——西安国际数字影像产业园,正以其独特的魅力和无限的潜力,吸引着全球的目光。这里,不仅是数字创意的孵化场,更是科技创新的策源地。 西安国际数…...
【网络安全】利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)
未经许可,不得转载。 文章目录 正文正文 目标:target.com 在子域sub1.target.com上,我发现了一个XSS漏洞。由于针对该子域的漏洞悬赏较低,我希望通过此漏洞将攻击升级至app.target.com,因为该子域的悬赏更高。 分析认证机制后,我发现: sub1.target.com:使用基于Cook…...
浙江所有省级医院体检报告查询上线浙里办!
在医院完成体检后不知道什么时候出报告 体检报告出来后又要跑一次医院去拿报告 历年体检报告没保管好 往年体检报告找不到了 ………… 编辑 为解决这些问题,浙江省卫生健康委结合“两卡融合、一网通办”工作的推进,不断丰富电子健康医保卡的功能&#…...
支付宝支付Java+uniapp支付宝小程序
JS: request.post(/vip/pay, {//这是自己写的java支付接口id: this.vipInfo.id,payWay: alipay-mini}).then((res) > {let success (res2) > {//前端的支付成功回调函数this.$refs.popup.close();// 支付成功刷新当前页面setTimeout(() > {this.doGetVipI…...
Linux-磁盘优化的几个思路
优化前先看看性能指标 I/O 基准测试 fio(Flexible I/O Tester)正是最常用的文件系统和磁盘 I/O 性能基准测试工具。这类工具非常用,了解即可 应用程序优化 应用程序处于整个 I/O 栈的最上端,它可以通过系统调用,来调…...
【第三版 系统集成项目管理工程师】第15章 组织保障
持续更新。。。。。。。。。。。。。。。 【第三版】第十五章 组织保障 15.1信息和文档管理15.1.1 信息和文档1.信息系统信息-P5462.信息系统文档-P546 15.1.2 信息(文档)管理规则和方法1.信息(文档)编制规范-P5472.信息(文档)定级保护-P5483.信息(文档)配置管理-P549练习 15.…...
从编程视角看生命、爱、自由、生活的排列顺序
从编程视角看生命、爱、自由、生活的排列顺序 离开大学校园,踏入大厂成为一名算法工程师后,我常以编程思维看待生活中的事物。在思考生命、爱、自由和生活的排列顺序时,发现从编程角度分析这些概念会有独特见解。 一、生命——程序的核心代…...
Lumerical——属性编辑窗口的详解
一、几何选项卡(Geometry tab) 通过几何选项卡中的选项可以设定物件的位置和大小。 二、材料选项卡(Material tab) ① 材料(MATERIAL): 在该字段可以设置成材料数据库中包含的任何材料。数据库也有可能包含一些新材料,也可以对已经包含的材料进行编辑。如果选…...
炸了!Claude 更新后 Mac 老系统直接报废:开发者凌晨三点爬起来修环境
一、真实事故现场:上海某团队的惊魂一夜 2026年5月15日凌晨2:37,上海浦东某科技公司。 高级工程师小李盯着屏幕上的错误信息,手指在键盘上飞快地敲击着。他面前是三个显示器,每个都显示着不同的终端窗口,满屏的红色错误信息像血一样刺眼。 "这怎么可能?"他自…...
Adobe-GenP 3.0终极指南:5分钟解锁Adobe CC全系列软件完整功能
Adobe-GenP 3.0终极指南:5分钟解锁Adobe CC全系列软件完整功能 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款功能强大的Adobe Cr…...
百度网盘Mac版终极破解指南:免费解锁SVIP高速下载体验
百度网盘Mac版终极破解指南:免费解锁SVIP高速下载体验 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版的下载速度限制而…...
3步解锁百度网盘全速下载,让你的macOS下载速度提升70倍
3步解锁百度网盘全速下载,让你的macOS下载速度提升70倍 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 你是否曾经在macOS上使用百度网盘时…...
FPGA 51,基于 ZYNQ 7Z010 的 FPGA 高速路由转发加速系统架构设计(Xilinx ZYNQ-MINI 7Z010 CLG400 -1)
目录 前言 一、系统整体架构设计 1.1 设计目标与性能指标...
电池级硫酸锂粉碎工艺与设备选型全解析
一、硫酸锂粉碎核心需求与特性 1. 硫酸锂基础物性(决定粉碎工艺边界) 形态与硬度:白色结晶 / 颗粒(无水 / 一水),莫氏硬度约 2–3,质地脆、易结块、吸湿性强。 纯度要求:工业级≥99.…...
数据库安全与权限管理
数据库安全与权限管理 1. 技术分析 1.1 数据库安全概述 数据库安全是保护数据资产的关键: 安全威胁未授权访问: 密码泄露SQL注入: 恶意SQL数据泄露: 敏感信息暴露数据篡改: 非法修改安全措施:访问控制加密存储审计日志1.2 权限管理 权限级别全局权限: ALL PRIVILEGE…...
别等 SQL 跑慢了再靠猜,NineData 怎样把问题一步步看清
SQL 变慢最怕的不是慢本身,而是大家一开始只能靠猜。明明语法没报错,业务一上线却卡住了;多了一个函数、少了一个索引,或者关联顺序不合适,就可能让数据库白白扫描一大堆数据。在很多团队里,这类问题最早往…...
别只傻等候补了!用Bypass分流抢票监控12306“捡漏”全攻略(含微信通知设置)
别只傻等候补了!用Bypass分流抢票监控12306"捡漏"全攻略(含微信通知设置) 春节临近,当你在12306官网上看到心仪车次显示"候补"或"无票"时,是否已经放弃希望?其实,…...
SolidWorks插件开发避坑指南:手把手教你搞定工具栏图标和菜单注册表清理
SolidWorks插件开发深度优化:图标管理与注册表清理实战 当你在SolidWorks插件开发中精心设计了功能完备的工具栏,却遭遇图标显示异常、工具栏名称重复或旧插件残留等问题时,那种挫败感每个开发者都深有体会。这些看似简单的界面问题背后&…...
