0
点赞
收藏
分享

微信扫一扫

C#读写sqlite(含二进制方式读写)


内容描述

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​​,控制台项目。

备注

我使用的sqlite是本地的,没有加密。
加密后访问报错。
所谓的加密如下图所示,但加密后可以解密。

C#读写sqlite(含二进制方式读写)_二进制sqlite_02

主要代码:

​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);

}


}
}

附图

上个图,证明真的成功了。

C#读写sqlite(含二进制方式读写)_C# sqlite_03


C#读写sqlite(含二进制方式读写)_二进制sqlite_04

示例代码地址

​​sqlite-binary-blob-demo​​


举报

相关推荐

0 条评论