4

我正在创建一个 C# windows 窗体应用程序,工作可以概括为用户填写一些表单并将数据保存在 Access 数据库中。现在我面临的问题是我必须将其作为安装文件交付给某人。我在想的是,一旦在其他计算机上安装并执行的代码会因为 Access db 的连接字符串而出错,因为它与那台计算机不匹配。我知道如果分发项目,我可以将连接字符串放在 app.config 中,每个用户都可以根据他/她的机器更改它。但是当我给出一个安装文件时,如何解决这个问题。

4

4 回答 4

3

假设您使用此连接字符串部署 app.config

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\yourFile.accdb;"

在 WinForms 应用程序中,|DataDirectory|快捷方式代表您的应用程序工作文件夹,但您可以在运行时更改它指向使用此代码的位置。

// appdomain setup information
AppDomain currentDomain = AppDomain.CurrentDomain;
//Create or update a value pair for the appdomain
currentDomain.SetData("DataDirectory", "Your user choosen path");

它消除了对完整路径进行硬编码的需要,您已经发现,在安装过程中会导致几个问题需要解决。当然,您的设置应该在您的用户选择的路径中提供您的数据库。

于 2012-06-14T07:39:12.353 回答
0

我以前遇到过这个问题。我是这样解决的。
(1) 在您的 app.config 文件中,在连接字符串中放置一个占位符。连接字符串将包含访问数据库文件的文件路径。用特殊字符串替换路径。

  <connectionStrings>
    <!-- original connection string , change it to the below line -->
    <!--  <add name="test" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;   Data   Source=d:\test\test.mdb "/> -->
    <add name="test" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;   Data   Source=##path##\test.mdb "/>
  </connectionStrings>

(2)当您的应用程序启动时,使用 Directory.GetCurrentDirectory 获取应用程序路径。在创建连接之前,将 ##path## 替换为客户端计算机上的实际路径。

static void test()
{
    string s = ConfigurationManager.ConnectionStrings["test"].ConnectionString;
    s.Replace("##path##", Directory.GetCurrentDirectory());
    OleDbConnection conn = new OleDbConnection(s);
}
于 2012-06-14T07:35:31.427 回答
0

ConnectionString您可以在运行时构建SqlConnectionStringBuilder

// Create a new SqlConnectionStringBuilder and
    // initialize it with a few name/value pairs.
    SqlConnectionStringBuilder builder =
        new SqlConnectionStringBuilder(GetConnectionString());

    // The input connection string used the 
    // Server key, but the new connection string uses
    // the well-known Data Source key instead.
    Console.WriteLine(builder.ConnectionString);

    // Pass the SqlConnectionStringBuilder an existing 
    // connection string, and you can retrieve and
    // modify any of the elements.
    builder.ConnectionString = "server=(local);user id=ab;" +
        "password= a!Pass113;initial catalog=AdventureWorks";

    // Now that the connection string has been parsed,
    // you can work with individual items.
    Console.WriteLine(builder.Password);
    builder.Password = "new@1Password";
    builder.AsynchronousProcessing = true;

    // You can refer to connection keys using strings, 
    // as well. When you use this technique (the default
    // Item property in Visual Basic, or the indexer in C#),
    // you can specify any synonym for the connection string key
    // name.
    builder["Server"] = ".";
    builder["Connect Timeout"] = 1000;
    builder["Trusted_Connection"] = true;
    Console.WriteLine(builder.ConnectionString);

    Console.WriteLine("Press Enter to finish.");
    Console.ReadLine();

编辑:您可以使用:在网络上查找 SQL Server

于 2012-06-14T07:32:05.037 回答
0

在部署应用程序以及 SQLLocalDB 的情况下,应将用户 (machine\user) 添加到您的数据库中以进行访问。

于 2018-04-25T17:02:37.530 回答