我将 c# windows 应用程序与 Access 数据库 (accdb) 连接,但该应用程序无法在其他计算机上运行

I connected c# windows app with Access database (accdb) but the application doesn't work on other computers

我用 C#-windows 应用程序项目连接了一个 Access 数据库 (accdb)。 "accdb" 数据库位于桌面的一个文件夹中。它在我的电脑上运行正常,但是当我构建一个安装文件并将其安装在其他电脑上时,该软件无法运行。 (我知道问题是数据库位于文件夹中)但我不知道如何更改在其他计算机上安装后仍然可以连接到数据库的代码。 有谁知道我应该如何解决这个问题? 这是我写的简单连接:

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\aa\Test.accdb;Jet OLEDB:Database Password=123;");

It works correctly on my computer but when i build a setup file and installed it on other computer the software didn't work.

主要原因是另一台机器上不存在该路径;你已经硬编码了你的路径。

 OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\aa\Test.accdb;Jet OLEDB:Database Password=123;");

C:\Users\aa\Test.accdb 这是实际问题,你不应该硬编码这个值,相反你有两个我能想到的选项。

  1. 在执行文件的应用程序旁边查找文件(这要求文件位于 exe 所在的同一目录中)。
  2. 您可以允许最终用户输入该文件的位置,如果存在,请保存此路径以便在需要时再次使用。

您可以使用我上面提到的任何一个和/或两者都使用,由您选择。下面是一个使用上面选项一的简单示例。

using System.Reflection;
using System.IO; 

public static string GetDBConnection()
{
   try
   {
      string dbExecPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Test.accdb");
      return $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={ dbExecPath };Jet OLEDB:Database Password=123;";
   }
   catch (Exception)
   {
      return string.Empty;
   }            
}

这将获取程序集位置(路径)并将其与您的文件名(db 文件)结合起来。然后将它与您的其他连接字符串部分和 return 的整个连接字符串结合起来。

请注意:必须使用的命名空间和 db 文件必须位于与 exe 相同的目录中,如果走这条路。

现在你可以这样称呼它了:

 OleDbConnection con = new OleDbConnection(GetDBConnection());

您可能想将 GetDBConnection() 分配给一个 var 并在构建连接之前检查它是否为空,它可能是空的。