在C#.NET中创建安装文件后更改连接字符串

时间:2012-06-14 07:23:26

标签: c# winforms

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

4 个答案:

答案 0 :(得分: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");

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

答案 1 :(得分: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();

修改:您可以使用此代码:Finding SQL Servers on the Network

答案 2 :(得分:0)

之前我遇到过这个问题。我以这种方式解决它 (1)在app.config文件中,在连接字符串中放置占位符。连接字符串将包含访问db文件的文件路径。用特殊字符串替换路径。

  <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);
}

答案 3 :(得分:0)

如果部署应用程序以及SQLLocalDB,则应在数据库中添加用户(machine \ user)以进行访问。