目录
一、需求
在本地部署客户端时,我们只想给客户一个客户端,不想给数据库,那么怎么样把数据库打包到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不会被替换,数据保留 |