当前位置:Gxlcms > 数据库问题 > .net core加载加密的sqlite文件失败解决方案

.net core加载加密的sqlite文件失败解决方案

时间:2021-07-01 10:21:17 帮助过:97人阅读

.net core加载加密的sqlite文件失败解决方案

??在项目开发过程中,遇到使用sqlite的场景。在加载加密的sqlite时,连接sqlite时报错,,先用百度查询了下资料,尚未找到对应解决方法,故接着在stackoverflow上查找,找到了解决思路,并已解决问题。

1.开发时所用到的相关内容

1.1相关项目组件

组件名称 版本
Microsoft.NETCore.App 2.1.0
sqlSugarCore 5.0.0.9

1.2 sqlite加密软件

软件名称 版本
SQLiteStudio 3.1.1

2.解决过程

2.1 遇错过程

??刚开始用的时候是直接用SQLiteStudio直接创建了SQLCipher加密的sqlite文件,用sqlsugar进行DB连接时候程序报错。报错提示如下:

  1. <code>file is encrypted or is not a database</code>

2.2 第一种解决方案——System.Data.Sqlite

2.2.1 使用System.Data.Sqlite

??在sqlite连接的时候,弃用sqlsugar,转而采用System.Data.Sqlite中的sqliteconnection来连接,这个需要自行从nuget中下载,当前采用是System.Data.Sqlite的最新版本1.0.112,且需要将原先加密方式进行改变,不然仍会报上述的错误提示,数据类型要改为System.Data.SQLite,输入文件名,密码后重新创建DB文件。

技术图片

2.2.2 相关Demo代码

??测试的SQLCipher.db3中已存有user表,表中仅有一个varchar(32)的Name字段,数据仅有一条为sqlcipher。以下是测试相关代码

  1. <code>using System;
  2. using System.Data;
  3. using System.Data.SQLite;
  4. SQLiteConnection clinet = new SQLiteConnection($"Data Source={path3}");
  5. string key = "123456";
  6. clinet.Open();
  7. SQLiteCommand command = clinet.CreateCommand();
  8. command.CommandText = "PRAGMA key = " + key;
  9. command.ExecuteNonQuery();
  10. command.CommandText = "select name from user";
  11. DataTable dt = new DataTable();
  12. SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
  13. adapter.Fill(dt);
  14. var result = dt.Rows[0][0];
  15. clinet.Close();</code>

??运行完毕后,未报错且成功取到结果。

2.3第二种解决方法—Microsoft.Data.Sqlite

??第一种方法实现后,再查找是否有更好的办法来解决。sqlsugar采用的sqlite连接是用的Microsoft.Data.Sqlite中的连接方式,在使用Microsoft.Data.Sqlite连接加密方法时,目前仅找到对应的连接数据类型为SQLCipher加密的文件的方法

技术图片

2.3.1引用的包

??第一个是引用nuget中的SQLitePCLRaw.bundle_sqlcipher包,我引用的是SQLitePCLRaw.bundle_sqlcipher包的最新版本1.1.14,第二个是Microsoft.Data.Sqlite包,因为sqlsugar中自带了,故就没有再次引用,没有的情况下需要引用Microsoft.Data.Sqlite。

2.3.2 相关Demo代码

??测试的SQLCipher.db3中已存有user表,表中仅有一个varchar(32)的Name字段,数据仅有一条为sqlcipher。以下是测试相关代码

  1. <code>using System;
  2. using System.Data;
  3. using Microsoft.Data.Sqlite;
  4. string path=@"C:\Users\Administrator\Desktop\SQLCipher.db3";
  5. string key="123456";//密码
  6. SqliteConnection client=new SqliteConnection($"Data Source={path}");
  7. client.Open();
  8. SqliteCommand command = client.CreateCommand();
  9. command.CommandText = "PRAGMA key = " + key;
  10. command.ExecuteNonQuery();
  11. command.CommandText = "select name from user";
  12. DataTable dt = new DataTable();
  13. SqliteDataAdapter adapter = new SqliteDataAdapter(command);
  14. adapter.Fill(dt);
  15. var result = dt.Rows[0][0];
  16. client.Close();</code>

??运行完毕后,未报错且成功取到结果。

2.4在sqlsugar中使用

??需要注意的地方是要在数据库开启的时候,先指定密码,再执行SQL语句,两者在同一个开启连接的DB连接中操作。

2.4.1相关Demo代码

??测试的SQLCipher.db3同上,以下是测试相关代码。

  1. <code>using System;
  2. using SqlSugar;
  3. string path=@"C:\Users\Administrator\Desktop\SQLCipher.db3";
  4. string key="123456";//密码
  5. ConnectionConfig config = new ConnectionConfig()
  6. {
  7. DbType = SqlSugar.DbType.Sqlite,
  8. ConnectionString = $"Data Source={path}",
  9. IsAutoCloseConnection = false
  10. };
  11. SqlSugarClient client = new SqlSugarClient(config);
  12. client.Open();
  13. client.Ado.ExecuteCommand($"PRAGMA key ={key}}");
  14. var data = client.Queryable<User>().ToList();
  15. client.Close();</code>

??运行完毕后,未报错且结果在data变量中。

.net core加载加密的sqlite文件失败解决方案

标签:sqli   net   密码   sqlite   查询   uga   using   http   ring   

人气教程排行