发布Windows应用程序后错误的数据库路径

时间:2016-02-26 12:57:10

标签: c# wpf database clickonce

我使用MS Access数据库开发了一个WPF应用程序。一切都很好。但是当我尝试发布应用程序以创建安装文件以在其他PC上使用该应用程序时,我在第一次运行该应用程序时遇到以下异常:

  

System.Data.OleDbException:找不到文件   “C:\用户\我\应用程序数据\本地\应用\ 2.0 \ 77NYD08R.L6A \ Y93TLQGV.2TD \ pier..tion_b5378b5ea7b941ca_0001.0000_9b5c3ff3b52b7eb4 \数据

我正在代码中访问数据库,如下所示:

private void ConnectToDatabase()
{
     dBConnection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=MyProjectDB.mdb";
     dBConnection.Open();
}

我在bin/Debug文件夹中添加了数据库。 为什么它试图从AppData\Local文件夹中获取数据库文件?我应该将数据库文件移动到另一个文件夹吗?

2 个答案:

答案 0 :(得分:0)

基本上你应该做的是:

不要将数据库文件保留在项目文件夹中,将其复制到其他位置,例如Environment.SpecialFolder.ApplicationData。您是在首次启动应用程序时执行此操作并且不存在数据库文件,因此您将数据库从项目文件夹复制到数据文件夹。

There is quite a good answer, how to deal with the problem here

  

如果您需要写入使用可执行文件部署的数据   应该先将它复制到你知道用户可以写的地方   to,例如Environment.SpecialFolder.ApplicationData,并写入   副本。 DataDirectory不仅不一定是用户可写的,   它是部署的一部分,而不是用户数据的一部分;如果你   修复或卸载您的可执行文件,然后DataDirectory获取   重新安装或删除。用户在删除时不喜欢它   数据,所以不要将其保存到DataDirectory

您可以通过此命令获取ClickOnce可执行文件的路径:

 var exePath = System.IO.Path.GetDirectoryName(
               new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

this answer: 如果数据库应由目标计算机的多个用户使用,请使用类似的东西:

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应用程序安装在用户配置文件中,因此数据库(如果要在1台计算机的不同用户之间共享)应放在c:\users\public文件夹中的某个位置。如果它只能由单个用户使用,则可以将其放在文档文件夹中或当前用户配置文件中的某个位置。

因此,对于共享数据库,在第一次部署后复制mdb的db文件夹可能是这样的:

Path.Combine(System.Environment.GetEnvironmentVariable("public"), YOUR_FOLDER_NAME)

对于非共享数据库,它将是

Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),YOUR_FOLDER_NAME)

通常有一个很好的理由不将数据保留在项目文件夹中,因为它很明显recommended by Microsoft here

  

卸载ClickOnce应用程序时,其数据目录为   也删除了。切勿使用数据目录存储最终用户管理的数据   数据,例如文件。

但如果你没问题,那么你可能只是在Visual Studio中更改文件属性see this answer

但是当您在项目中更新mdb文件时,本地安装的数据文件会被已发布的ClickOnce更新 - one more link here重写,只是为了看到这是通过ClickOnce将数据复制到其他地方的常用方法启动时的app。

答案 1 :(得分:-1)

您需要在连接字符串

中提供访问数据库的位置
dBConnection.ConnectionString  = "Provider=MICROSOFT.ACE.OLEDB.12.0; " +
                "Data Source=|DataDirectory|MyProjectDB.mdb"

| DataDirectory目录|需要是一个完整的相对路径,这只是一个占位符。所以你可以使用

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"