【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不会被替换,数据保留 |

相关推荐
宝桥南山10 小时前
.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData
microsoft·微软·c#·asp.net·.net·.netcore
XLYcmy10 小时前
信息检索报告数字经济赋能城市低碳治理的路径研究——基于“传统数据库 + 生成式人工智能”双轮驱动的检索实践 检索实施与结果分析 Web of Science
数据库·ai·llm·prompt·ssci·deepseek·wos
Decay__10 小时前
21_MySQL 优化案例集 —— 慢 SQL 优化、索引重构与参数调整收益对比
运维·数据库·sql·mysql·架构
1-1=011 小时前
C# 中 Lambda、Linq 与 Expression
c#·linq
codigger11 小时前
MySQL 深分页优化:limit 100000, 10 慢在哪,怎么救
数据库·sql·mysql·程序员
麦壳饼11 小时前
SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写
数据库·人工智能·sql·sonnetdb
zhanghaha131412 小时前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
zhanghaha131412 小时前
C# 系列教程_8 循环语句 保姆级精讲(面向新手)
开发语言·c#
Rabitebla20 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
Decay__21 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构