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
相关产品推荐
相关产品推荐

