发布 Windows 应用程序后数据库路径错误
本文关键字:路径 错误 数据库 Windows 应用程序 发布 | 更新日期: 2023-09-27 18:36:16
我用MS Access数据库开发了一个WPF应用程序。一切正常。但是,当我尝试发布应用程序以创建安装文件以在其他PC上使用该应用程序时,首次运行该应用程序时出现以下异常:
System.Data.OleDbException: 找不到文件 'C:''Users''me''AppData''Local''Apps''2.0''77NYD08R.L6A''Y93TLQGV.2TD''码头tion_b5378b5ea7b941ca_0001.0000_9b5c3ff3b52b7eb4''Data.
我正在代码中访问数据库,如下所示:
private void ConnectToDatabase()
{
dBConnection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=MyProjectDB.mdb";
dBConnection.Open();
}
我bin/Debug
文件夹中添加了数据库。为什么它试图从文件夹中获取数据库文件AppData'Local
?我应该将数据库文件移动到另一个文件夹吗?
基本上你应该做的是:
不要将数据库文件留在项目文件夹中,将其复制到其他地方,例如Environment.SpecialFolder.ApplicationData
.在首次启动应用且不存在数据库文件时执行此操作,因此将数据库从项目文件夹复制到数据文件夹。
有一个很好的答案,如何处理这里的问题。
如果需要写入与可执行文件一起部署的数据,则 应该首先将其复制到您知道用户能够编写的地方 到,例如 环境.特殊文件夹.应用程序数据,并写入 副本。不仅数据目录不一定可由用户写入, 它是部署的一部分,而不是用户数据的一部分;如果你 修复或卸载可执行文件,然后数据目录获取 重新安装或删除。用户不喜欢您删除他们的 数据,所以不要将其保存到数据目录
您可以通过以下命令获取 ClickOnce 可执行文件的路径:
var exePath = System.IO.Path.GetDirectoryName(
new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);
然后看看这个答案:如果数据库应由目标计算机的多个用户使用,请使用类似的东西:
AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(System.Environment.GetEnvironmentVariable("public"), YOUR_FOLDER_NAME));
或者一个用户只有一个数据库:
AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),YOUR_FOLDER_NAME));
您应该知道,ClickOnce 部署方法允许非本地管理员的用户安装你的应用,因此最好在目标计算机上选择默认情况下应为最终用户可写的文件夹。
然后,在配置文件的连接字符串中使用|DataDirectory|
,如上述答案所示。
DataDirectory 是将 mdb 文件从 exePath 复制到目标数据文件夹的地方。
您的问题也是,ClickOnce 应用程序安装在用户配置文件中,因此如果要在一台计算机的不同用户之间共享数据库,则应将数据库放置在c:'users'public
文件夹中的某个位置。如果它仅由单个用户使用,则可以将其放置在文档文件夹中或当前用户配置文件中的某个位置。
因此,对于共享数据库,在第一次部署后复制 mdb 的数据库文件夹可能是这样的:
Path.Combine(System.Environment.GetEnvironmentVariable("public"), YOUR_FOLDER_NAME)
对于非共享数据库,它将是
Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),YOUR_FOLDER_NAME)
通常有一个很好的理由不将数据留在项目文件夹中,因为Microsoft在这里非常明确地建议这样做:
卸载 ClickOnce 应用程序时,其数据目录为 也被删除了。切勿使用数据目录来存储最终用户托管的内容 数据,例如文档。
但是,如果您没问题,那么您可以在Visual Studio中更改文件属性,请参阅此答案。
但是,当您在项目中udpedd文件时,本地安装的数据文件会被已发布的ClickOnce更新重写 - 这里还有一个链接,只是为了看到这是在启动时由ClickOnce应用程序将数据复制到其他地方的常见方法。
需要在连接字符串中提供访问数据库的位置
dBConnection.ConnectionString = "Provider=MICROSOFT.ACE.OLEDB.12.0; " +
"Data Source=|DataDirectory|MyProjectDB.mdb"
|数据目录|需要是一个完整的相对路径,这只是一个占位符。所以你可以使用
var path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
dBConnection.ConnectionString = "Provider=MICROSOFT.ACE.OLEDB.12.0; " +
"Data Source=" + path + "'MyProjectDB.mdb"