使用System.Data.SQLite开发WPF应用时无法将数据库创建到指定相对路径如何解决
问题解决步骤
1. 修正连接字符串配置
首先修正providerName参数,你当前使用的System.Data.SqlClient是SQL Server的驱动,SQLite对应正确配置如下:
<connectionStrings> <add name="Default" connectionString="Data Source=|DataDirectory|\MyDB.db;Version=3;" providerName="System.Data.SQLite" /> </connectionStrings>
2. 调整DataDirectory设置时机
你当前把SetData逻辑放在窗口的InitializeComponent()之后,如果数据库初始化逻辑在窗口加载阶段就执行,会导致DataDirectory还没完成赋值就被读取。请将该逻辑移到App.xaml.cs的Startup事件中,这是WPF应用最早的执行入口:
using System.IO; using System.Reflection; using System.Windows; namespace YourProjectNamespace { public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); // 先获取当前程序集所在的Debug/Release目录 string assemblyDir = new FileInfo(Assembly.GetEntryAssembly().Location).DirectoryName; // 向上跳一级到bin目录 string binDir = Directory.GetParent(assemblyDir).FullName; // 确保bin目录存在,避免首次运行路径不存在报错 if (!Directory.Exists(binDir)) { Directory.CreateDirectory(binDir); } AppDomain.CurrentDomain.SetData("DataDirectory", binDir); } } }
3. 调整项目中MyDB.db文件的复制规则
你当前的数据库文件默认是复制到编译输出的Debug/Release目录,要让它自动复制到bin根目录,可通过生成后事件实现:
- 右键项目→属性→生成事件
- 在「后期生成事件命令行」中填入以下命令:
xcopy /y "$(TargetDir)MyDB.db" "$(ProjectDir)bin\"
- 同时确保项目中
MyDB.db文件的「复制到输出目录」属性设置为「如果较新则复制」,保证文件修改后会同步更新。
4. 可选:路径逻辑兼容优化
如果担心后续发布时目录结构变化导致GetParent取错路径,可替换为明确的路径匹配逻辑:
string assemblyDir = new FileInfo(Assembly.GetEntryAssembly().Location).DirectoryName; string binDir; // 判断当前目录是否是Debug/Release子目录 if (assemblyDir.EndsWith("Debug", StringComparison.OrdinalIgnoreCase) || assemblyDir.EndsWith("Release", StringComparison.OrdinalIgnoreCase)) { binDir = Directory.GetParent(assemblyDir).FullName; } else { // 发布场景下直接使用程序所在目录 binDir = assemblyDir; }
内容的提问来源于stack exchange,提问作者GNZ
相关产品推荐
相关产品推荐

