内容描述
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);
}
}
}
附图
上个图,证明真的成功了。