当前位置:   article > 正文

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

sqlite c#

内容描述

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

项目版本: .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();
            }
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

二进制形式读写文件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;
        }
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

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

        }

       
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

附图

上个图,证明真的成功了。
在这里插入图片描述
在这里插入图片描述

示例代码地址

sqlite-binary-blob-demo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/480837
推荐阅读
相关标签
  

闽ICP备14008679号