C# 使用Microsoft.Data.Sqlite 的一些方法 System.Data.SQLite 包加密失败
SQLite Encryption(加密)问题_码农01号的博客-程序员宅基地 - 程序员宅基地 (cxyzjd.com)
SQLite Encryption(加密)问题_码农01号的博客-程序员宅基地 - 程序员宅基地 (cxyzjd.com)
SQLite Encryption(加密)问题_码农01号的博客-程序员宅基地
什么是SQLite?
SQLite是一个C语言实现的小型、快速、自包含、高可靠性、功能全面的SQL数据库引擎。
起因:
刚好项目上有个需求,需要使用VS2019+.Net famework 4.6.1+sqlite完成数据层。
System.Data.SQLite库
先尝试了官方的System.Data.SQLite 包。
首先,使用VS2019创建.名字为 TestSqlite的.Net famework 4.6.1的控制台项目。
通过nuget安装
这个库依赖了很多如linq、EF6等其他库.个人不是很喜欢···有需要的朋友直接安装是可以的。
Stub.System.Data.SQLite.Core.NetFramework
这个库没有依赖项···这里推荐···
通过nuget安装后使用如下代码成功运行。
using System;
using System.Data.SQLite;
namespace TestSqlite
{
internal class Program
{
private static void Main(string[] args)
{
string cs = "Data Source=TestSqlite.sqlite";//数据库连接字符串
string stm = "SELECT SQLITE_VERSION()";//查看版本
var con = new SQLiteConnection(cs);//创建连接
con.Open();
var cmd = new SQLiteCommand(stm, con);
string version = cmd.ExecuteScalar()
.ToString();//查看版本
Console.WriteLine($"SQLite version: {version}");
Console.ReadKey();
}
}
}
运行后成功,可以看到版本是3.35.5
在bin文件夹下也生成了sqlite数据库
加密失败
作为一个数据库,没有密码是不行的。
于是我们在连接字符串加上password
运行,报错
System.IO.FileNotFoundException:“未能加载文件或程序集“System.Data.SQLite.SEE.License, Version=1.0.114.0, Culture=neutral, PublicKeyToken=433d9874d0bb98c5”或它的某一个依赖项。系统找不到指定的文件。”
这个System.Data.SQLite.SEE(SQLite Encryption Extension)
是System.Data.SQLite 的官方 SQLite 加密扩展包。
没错···SQlite开源版本是加密收费的···购买需要2000$·····
贫穷让我另谋出路
曲线救国 :Microsoft.Data.Sqlite
经过资料查询,发现微软的Microsoft.Data.Sqlite
库支持,所以再次进行尝试。
首先,使用VS2019创建.名字为 TestSqlite的.Net famework 4.6的控制台项目。
通过NuGet安装 Microsoft.Data.Sqlite.Core和 SQLitePCLRaw.bundle_e_sqlcipher
或通过程序包管理器安装
Install-Package Microsoft.Data.Sqlite.Core
另外我们需要安装加密包Install-Package SQLitePCLRaw.bundle_e_sqlcipher
·
Dapper.Crud
个人比较喜欢Dapper,不喜欢的小伙伴可以使用自己的ORM,不用安装这个,使用自己喜欢的方式创建表即可。
Install-Package Dapper.Crud
安装完成后使用如下代码
using System;
using System.Data;
using Dapper;
using Microsoft.Data.Sqlite;
namespace TestSqlite
{
internal class Program
{
private static void Main(string[] args)
{
var connStr = @"Data Source=TestSqlite.sqlite;";//连接字符串
var conn = new SqliteConnectionStringBuilder(connStr)
{
Mode = SqliteOpenMode.ReadWriteCreate,
Password = "password"
}.ToString();//使用这个方式设置密码,避免sql注入
var connection = new SqliteConnection(conn);//创建SQLite连接
if (connection.State == ConnectionState.Closed)
{
connection.Open();
var createTableSqlStr = @"CREATE TABLE if not exists ""Alarm"" ( ""Id"" INTEGER NOT NULL, ""AlarmName"" TEXT, ""AlarmTypeId"" INTEGER, PRIMARY KEY ( ""Id"" ) );";
var result = connection.Execute(createTableSqlStr);//使用Dapper执行sql语句创建表
Console.ReadKey();
}
}
}
}
运行后成功!
这里有个需要注意的点:
在设置密码创建数据库后,需要使用ORM执行sql创建表,如果是空数据库,是未加密的··可以直接打开。原因暂未可知。希望知道的大佬能告知
我们使用Navicat for SQLite 打开,如果出现以下弹窗,就说明加密成功了!
使用Navicat for SQLite 打开加密数据库
没有Navicat的童鞋点这里下载安装
替换sqlite3.dll
步骤如下:
打开Bin文件夹下的runtimes
根据自己系统选择文件夹x64还是x86
复制win-x64\native 下的e_sqlcipher.dll
打开Navicat 的安装目录,将刚刚复制的e_sqlcipher.dll复制到该目录下。
备份sqlite3.dll(将该dll复制到其他文件夹下),
然后将复制的e_sqlcipher.dll改名成 sqlite3.dll 替换掉原来的sqlite3.dll
设置密码
在数据库连接右键编辑连接–>高级–>设置数据库文件位置–>勾选已加密–>设置密码–>勾选保存密码
双击连接数据库,连接成功!!
C# 使用Microsoft.Data.Sqlite 的一些方法 System.Data.SQLite 包加密失败的更多相关文章
- 【EF框架异常】System.MissingMethodException:“找不到方法:“System.Data.Entity.ModelConfiguration.Configuration.PrimitivePropertyConfiguration
最近调试EF的时候遇到下面这个问题 System.MissingMethodException:“找不到方法:“System.Data.Entity.ModelConfiguration.Config ...
- 报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"
报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState". 出错语句停留 ...
- SQLite 之 C#版 System.Data.SQLite 使用
简介 SQLite简介 SQLite,是一款轻型的关系型数据库.它的设计目标是嵌入式. 它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 C++.C ...
- C#连接Oracle数据库的方法(System.Data.OracleClient、Oracle.DataAccess.Client也叫ODP.net、Oracle.ManagedDataAccess.dll)
官方下载地址(ODP.net)(中文):http://www.oracle.com/technetwork/cn/topics/dotnet/downloads/index.html 官方下载地址(O ...
- C++: read access data using ADOX.DLL and System::Data::OleDb
#pragma once #include "Form2.h" namespace cdemo { using namespace System; using namespace ...
- MVC ---- 无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"
1.EF 5.0解决方法 先卸载EF:Uninstall-Package EntityFramework -Force 在安装EF5.0:Install-Package EntityFramework ...
- System.Data.SQLite.dll控件常规安装方法
原文地址:http://www.jb51.net/dll/System.Data.SQLite.dll.html 文件运行必须安装 Microsoft Visual C++ 2010 SP1 Re ...
- 未找到具有固定名称“System.Data.SQLite”的 ADO.NET 提供程序的实体框架提供程序
用户代码未处理 System.InvalidOperationException HResult=-2146233079 Message=未找到具有固定名称"System.Data. ...
- System.Data.SQLite安装的相关问题
在使用System.Data.SQLite的过程中,遇到各种问题,特此记录下.(都被搞的折寿了,不仔细看文档的下场!) 1.选对.net Framework的版本. 2.X64和X86的问题,如果项目 ...
- 使用System.Data.SQLite及其EF模块操作SQLite数据库(文件)
SQLite for .NET (System.Data.SQLite) introduction An ADO.NET provider for SQLite including EF and Li ...
随机推荐
- Netty源码—10.Netty工具之时间轮
大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核 ...
- Go初入武林之乘法表
为统一管理源码, 请到gitee中查看. GoTimesTable
- HTML5
转
贴个图:
- vue获取浏览器地址栏参数
this.accountId = this.$route.query.id
- 再谈kettle两种循环之--调用http分页接口循环获取数据
再谈kettle两种循环之 – 调用http分页接口循环获取数据 1.场景介绍: 由于数据量比较大,接口有返回限制,需要用到循环分页获取数据 2.案例适用范围: 循环job可参考,变量运用可参考,调用 ...
- .NET Core中的配置Configuration实战
在前面的一篇文章中,我们对.NET 中的配置Configuration进行了一个详细的介绍,并且从整个源码的解读解释了配置中的核心接口以及主要的实现类.文章链接为:https://cshellowor ...
- c#使用内存映射像处理内存一样去快速处理文件
在 .NET Core 中,`System.IO.MemoryMappedFiles.MemoryMappedFile` 类提供了对内存映射文件的支持.通过将文件映射到内存,你可以在应用程序中直接访问 ...
- XXL-MQ v1.3.0 | 分布式消息队列
Release Notes 1.[增强]消费者分组属性 "group" 支持为空,为空时自动赋值UUID,方便实现多分组广播消费: 2.[增强]海量数据堆积:消息数据存储在DB中, ...
- 【记录】Python3|Selenium 下载 PDF 不预览不弹窗(2024年)
版本: Chrome 124 Python 3.12 Selenium 4.19.0 版本与我有差异不要紧,只要别差异太大比如 Chrome 用 57 之前的版本了,就可以看本文. 如果你从前完全没使 ...
- M系Mac原生运行《原神》保姆级教程!手把手教你零门槛畅玩手游!
Apple Silicon芯片的进化正在重塑M系列Mac的跨平台能力.通过开源工具PlayCover,开发者社区成功突破系统限制,让<原神 >等热门手游在M1/M2/M3/M4芯片设备上流 ...