【C#桌面客户端系列学习-11】将SQLite数据库打包到exe里

目录

一、需求

二、操作步骤

1、创建数据库

2、把c_test.db加入项目

3、生成操作

4、程序启动时释放

5、打包生成exe

三、运行效果


一、需求

在本地部署客户端时,我们只想给客户一个客户端,不想给数据库,那么怎么样把数据库打包到exe里呢?下面就详细介绍。

核心思路:把c_test.db作为嵌入的资源打进exe里,程序第一次运行时把它释放到磁盘上,之后不再释放。

二、操作步骤

1、创建数据库

用 Navicat 或代码建好所有表(user、日志表等),命名为c_test.db

2、把c_test.db加入项目

在根目录下将创建文件夹Resources,将刚创建的数据库放到该文件夹下。

在VS2022里,右键项目->添加->现有项,选择刚才创建的c_test.db,这样就将c_test.db加入到了项目。

3、生成操作

在资源管理器中找到刚加入项目的c_test.db,右键属性设置:生成操作=嵌入的资源,复制到输出目录=不复制。

4、程序启动时释放

在Program.cs的Main方法里(Application.Run 之前),写下以下代码

cs 复制代码
using System.IO;
using System.Reflection;

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    InitDatabase();

    Application.Run(new Form1());
}

static void InitDatabase()
{
    string dbPath = Path.Combine(Application.StartupPath, "c_test.db");

    // 只有 c_test.db 不存在时才从嵌入资源释放
    if (!File.Exists(dbPath))
    {
        // 嵌入资源的完整名称:项目默认命名空间 + 文件名
        string resourceName = "test.c_test.db";

        using (Stream stream = Assembly.GetExecutingAssembly()
            .GetManifestResourceStream(resourceName))
        {
            if (stream == null)
            {
                MessageBox.Show("找不到嵌入的数据库资源:" + resourceName,
                    "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            using (FileStream fs = new FileStream(dbPath, FileMode.Create))
            {
                stream.CopyTo(fs);
            }
        }
    }
}

5、打包生成exe

将exe复制到别的文件夹下或者分发给别的客户时,运行exe时,会在exe所在目录下自动创建c_test.db。

如果给文件夹下的c_test.db里是空的,检查是否正确引入、生成操作是否正确、文件名是否一致。

三、运行效果

|-------|------------------------------------------------|
| 场景 | 结果 |
| 第一次运行 | 磁盘上没有c_test.db -> 从exe内释放一份 -> 正常读写 |
| 第二次运行 | c_test.db已经存在 -> 跳过释放 -> c_test.db不会被替换,数据保留 |

相关推荐
下页、再停留1 小时前
【C#桌面客户端系列学习-12】封装SQLite数据库基础操作工具类(CURD)
数据库·c#·visual studio
LYmatch1 小时前
2024年408真题第41~47题汇总解析
数据库
程序员Sunday1 小时前
Redis 缓存穿透、击穿、雪崩怎么区分?从回源压力找原因
数据库·redis·缓存
我科绝伦(Huanhuan Zhou)1 小时前
磐维数据库(PanWeiDB)日常运维命令总结
运维·数据库
guo_wen_qiang1 小时前
redis实现秒杀功能-超卖&库存遗留问题的解决
数据库·redis·缓存
逐流人1 小时前
Redis内存数据库:从数据类型到集群部署
linux·运维·数据库·redis·缓存·云计算
l1t2 小时前
DeepSeek总结的在 NVIDIA Vera 上对 DuckDB v2.0-dev 进行基准测试
服务器·数据库·sql
渣渣盟2 小时前
2000万QPS背后的存储引擎博弈:InnoDB、MyRocks、WiredTiger到底谁更强?
数据库·mysql
ss2732 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 11 PostgreSQL安装部署常见问题排查与解决
数据库·笔记·postgresql