赞
踩
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。
这是一个使用C#读写Sqlite数据库的示例,含二进制方式的读写。
windows 10 64bit
SQLite版本
sqlite> select version();
no such function: version
sqlite> SELECT sqlite_version();
+------------------+
| sqlite_version() |
+------------------+
| 3.21.0 |
+------------------+
1 row in set (0.02 sec)
项目版本: .NET 5
,控制台项目。
使用了Dapper,因为好用。
项目依赖如图:
备注
我使用的sqlite是本地的,没有加密。
加密后访问报错。
所谓的加密如下图所示,但加密后可以解密。
SaveAndRead1.cs
读写文本内容(将文本转换为二进制读写)
using System; using System.Collections.Generic; using System.Data; using System.Linq; using Dapper; using Microsoft.Data.Sqlite; namespace dotSQLiteDemo { public class SaveAndRead1 { public static string connStrDefault = "安得倚天抽宝剑,把汝裁为三截;一截遗欧,一截赠美,一截还东国。太平世界,环球同此凉热。"; public static int WriteData() { using (IDbConnection conn = new SqliteConnection(Conn.conStr)) { //conn.Open(); var sql = "insert into test(name,age,photo) values(@name,@age,@photo)"; byte[] vs = System.Text.Encoding.UTF8.GetBytes(connStrDefault); DynamicParameters dynamic = new DynamicParameters(); dynamic.Add("name", "王大炮"); dynamic.Add("age", 17); dynamic.Add("photo", vs); int rows = conn.Execute(sql, dynamic); if (rows > 0) { var sql2 = "select last_insert_rowid() from test"; var id = conn.Query<int>(sql2).FirstOrDefault(); Console.WriteLine($"Sqlite插入数据成功,新的主键为 {id}"); return id; } } return 0; } public static List<TestModel> GetList() { using (IDbConnection conn = new SqliteConnection(Conn.conStr)) { //conn.Open(); var output = conn.Query<TestModel>("select * from test"); return output.ToList(); } } } }
二进制形式读写文件FileBinary.cs
using System; using System.Data; using System.IO; using System.Linq; //----引入必要的命名空间 using Dapper; using Microsoft.Data.Sqlite; namespace dotSQLiteDemo { public class FileBinary { public static string path = @"C:\Users\Administrator\source\repos\dotSQLiteDemo\bb.jpg"; public static int SaveFileByte() { try { using (IDbConnection db = new SqliteConnection(Conn.conStr)) { byte[] byteArray = File.ReadAllBytes(path); var name = path + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var sql = "insert into test(name,age,photo) values(@name,@age,@photo)"; DynamicParameters pars = new DynamicParameters(); pars.Add("name", name); pars.Add("age", new Random().Next()); pars.Add("photo", byteArray); int rowsAffected = db.Execute(sql, pars); if (rowsAffected > 0) { Console.WriteLine($"文件转二进制插入成功,pk = {1}"); return 1; } return 0; } } catch (Exception e) { Console.WriteLine(e.Message); return 0; } } public static void ReadFileByte(int pk) { try { using (IDbConnection db = new SqliteConnection(Conn.conStr)) { string sqlQuery = $"select * from test where id = {pk}"; TestModel test1 = db.Query<TestModel>(sqlQuery).ToList().FirstOrDefault(); if (null != test1) { string basePath = AppContext.BaseDirectory; var ext = Path.GetExtension(path); var guid = Guid.NewGuid().ToString(); string newPath = Path.Combine(basePath, guid + ext); StreamToFile(test1.photo, newPath); Console.WriteLine($"从sqlite读取文件内容成功, newPath = {newPath}"); } } } catch (Exception e) { Console.WriteLine(e.Message); } } public static int StreamToFile(byte[] photo, string newPath)//反向转换 { byte[] bytes = photo; FileStream fs = new FileStream(newPath, FileMode.Create, FileAccess.Write); fs.Write(bytes, 0, bytes.Length); fs.Flush(); fs.Close(); return 0; } } }
Main方法Program.cs
namespace dotSQLiteDemo { class Program { /// <summary> /// 请注意,给Sqlite的库加密则会读取报错,亲测 /// </summary> /// <param name="args"></param> static void Main(string[] args) { //读 //SaveAndRead1.GetList(); //写入sqlite //SaveAndRead1.WriteData(); //二进制形式写入文件 //FileBinary.SaveFileByte(); //读出二进制内容,保存为本地文件 FileBinary.ReadFileByte(7); } } }
上个图,证明真的成功了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。