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

使用了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);

        }

       
    }
}

附图

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

示例代码地址

sqlite-binary-blob-demo

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在C++中更新SQLite3中的二进制数据,您可以使用SQLite3提供的BLOB类型。以下是一个简单的示例代码,它演示如何更新一个名为"my_table"的表中的二进制数据列"my_blob_column": ```c++ #include <sqlite3.h> #include <iostream> #include <fstream> using namespace std; int main() { // Open database sqlite3 *db; int rc = sqlite3_open("my_database.db", &db); if (rc != SQLITE_OK) { cerr << "Error opening database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); return 1; } // Read binary data from a file ifstream file("my_binary_data.bin", ios::binary | ios::ate); if (!file.is_open()) { cerr << "Error opening file." << endl; sqlite3_close(db); return 1; } streamsize size = file.tellg(); file.seekg(0, ios::beg); char *buffer = new char[size]; if (!file.read(buffer, size)) { cerr << "Error reading file." << endl; delete[] buffer; sqlite3_close(db); return 1; } file.close(); // Update binary data in database sqlite3_stmt *stmt; const char *sql = "UPDATE my_table SET my_blob_column = ? WHERE id = 1;"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { cerr << "Error preparing statement: " << sqlite3_errmsg(db) << endl; delete[] buffer; sqlite3_close(db); return 1; } sqlite3_bind_blob(stmt, 1, buffer, size, SQLITE_TRANSIENT); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { cerr << "Error updating data: " << sqlite3_errmsg(db) << endl; delete[] buffer; sqlite3_finalize(stmt); sqlite3_close(db); return 1; } // Cleanup delete[] buffer; sqlite3_finalize(stmt); sqlite3_close(db); return 0; } ``` 在这个示例中,我们首先打开了一个名为"my_database.db"的SQLite3数据库。然后,我们从一个名为"my_binary_data.bin"的文件中读取二进制数据,并将其存储在一个名为"buffer"的字符数组中。接下来,我们准备了一个SQL语句,使用"sqlite3_prepare_v2"函数编译该语句,并使用"sqlite3_bind_blob"函数绑定二进制数据到该语句中。最后,我们使用"sqlite3_step"函数执行该语句并更新数据库中的二进制数据。最后,我们清理并关闭数据库。 请注意,在这个示例中,我们使用了一个名为"SQLITE_TRANSIENT"的特殊标记来告诉SQLite3库,我们正在使用动态分配的内存来存储二进制数据。这意味着SQLite3库将复制这些数据,而不是仅仅在内部保存指向该数据的指针。这可以确保在更新期间,我们的内存不会被释放或修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值