You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# ClickOnce应用首次启动设置SQLite数据库路径的代码位置咨询

C# ClickOnce应用首次启动指定SQLite路径的实现方案

一、启动引导窗体的代码位置:选frm_AP_Utilities_Load事件

别放构造函数里,原因很简单:构造函数里InitializeComponent()刚执行完,窗体控件还没完全初始化,这时候弹新窗体容易出现界面加载异常。Load事件是窗体即将显示、所有初始化工作完成后触发的,此时应用环境已经就绪,适合做首次启动的引导操作。

二、具体实现步骤

1. 先做首次启动判断

在Load事件里先检查是否已经配置过数据库路径——可以用项目的Settings存储一个标记,或者直接检查连接字符串对应的路径是否有效:

private void frm_AP_Utilities_Load(object sender, EventArgs e)
{
    // 从Settings读取已保存的数据库路径
    string savedDbPath = Properties.Settings.Default.APDbFilePath;
    // 判断是否未配置或配置的路径无效
    if (string.IsNullOrEmpty(savedDbPath) || !File.Exists(savedDbPath))
    {
        // 弹出路径选择窗体
        using (var pathSelectForm = new frm_DbPathSelector())
        {
            if (pathSelectForm.ShowDialog() == DialogResult.OK)
            {
                // 拼接完整的数据库文件路径(比如固定文件名AP_Tools.db)
                string finalDbPath = Path.Combine(pathSelectForm.SelectedFolder, "AP_Tools.db");
                // 保存路径到Settings
                Properties.Settings.Default.APDbFilePath = finalDbPath;
                Properties.Settings.Default.Save();
                // 更新配置文件里的连接字符串
                RefreshConnectionString(finalDbPath);
            }
            else
            {
                // 用户取消选择,直接退出应用(也可以做其他处理)
                MessageBox.Show("未指定数据库存储路径,应用无法运行");
                Application.Exit();
            }
        }
    }
}

2. 实现路径选择窗体frm_DbPathSelector

这个窗体不用复杂,放一个文件夹选择对话框、路径显示文本框和确认按钮就行:

public partial class frm_DbPathSelector : Form
{
    // 对外暴露选中的文件夹路径
    public string SelectedFolder { get; private set; }

    public frm_DbPathSelector()
    {
        InitializeComponent();
    }

    // 浏览文件夹按钮点击事件
    private void btnBrowse_Click(object sender, EventArgs e)
    {
        using (var folderDialog = new FolderBrowserDialog())
        {
            // 可以设置默认打开的文件夹,比如用户文档目录
            folderDialog.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            if (folderDialog.ShowDialog() == DialogResult.OK)
            {
                txtFolderPath.Text = folderDialog.SelectedPath;
            }
        }
    }

    // 确认按钮点击事件
    private void btnConfirm_Click(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(txtFolderPath.Text) && Directory.Exists(txtFolderPath.Text))
        {
            SelectedFolder = txtFolderPath.Text;
            DialogResult = DialogResult.OK;
            Close();
        }
        else
        {
            MessageBox.Show("请选择一个有效的文件夹");
        }
    }
}

3. 更新连接字符串的方法

因为ClickOnce的配置文件是用户级别的,要打开用户配置来修改:

private void RefreshConnectionString(string dbFullPath)
{
    // 打开用户范围的配置文件
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    var connSection = config.ConnectionStrings;
    // 假设你的连接字符串名称是"AstronomyToolDb"
    if (connSection.ConnectionStrings["AstronomyToolDb"] != null)
    {
        connSection.ConnectionStrings["AstronomyToolDb"].ConnectionString = $"Data Source={dbFullPath};Version=3;";
        // 保存修改并刷新配置
        config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("connectionStrings");
    }
}

4. 备份恢复功能的基础

后续做备份时,直接读取Properties.Settings.Default.APDbFilePath拿到数据库文件路径,复制到备份目录即可;恢复时,要么让用户选择备份文件覆盖现有数据库,要么修改Settings里的路径并更新连接字符串。

内容的提问来源于stack exchange,提问作者OldAndRetired

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:12:10