如何更改不同工作位置的连接字符串

时间:2010-02-08 19:45:03

标签: c# sql svn settings connection-string

我正在开发一个C#4.0,WPF 4.0,SQL 2008项目,我在家里和办公室工作。我只是根据其他问题中的建议使用Visual SVN设置SubVersion。我遇到的问题是数据库的连接字符串对于每个位置都是不同的。

在家里,我的开发系统上有数据库,办公室里的数据库在我们的服务器上。两者都没有暴露在互联网上,所以我必须同时使用它们。是否有一种优雅的方式来自动选择正确的方法?

更新

我一直有这方面的问题,我正在尝试平衡学习版本控制与完成我的项目工作。我一直在阅读颠覆书,并且对它涵盖的内容很好。我的一个真正问题是处理需要在开发环境正确之间变化的文件。我可以很容易地编写代码,但这对我来说似乎有些古怪。我确实看到不止一篇关于svn:exclude可能是多么古怪的文章,而且在我看来,在家工作的是导致工作中的问题,反之亦然。

也许我只是不知道得出正确的答案所以请指出正确的方向(我不需要你为我做)或投票给现有最好的答案我将继续我的研究

非常感谢

8 个答案:

答案 0 :(得分:4)

如果你真的想要完全自动化,你可以这样做:

首先,在源代码管理中存储不同环境的设置,但不存储实际的配置文件。例如:

configfiles\app.config.mikeb_home
configfiles\app.config.local
configfiles\app.config.development
configfiles\app.config.staging
configfiles\app.config.production

然后在构建配置中,您可以添加一个步骤,将正确的配置文件复制到根app.config。例如。使用基于'environment'参数(computername,username,...)的'pre-build event'(命令行脚本)。你可以通过在.csproj文件中添加一些msbuild命令来实现同样的目的。

然而,这一切真的值得吗? TortoiseSVN有一个名为'ignore-on-commit'的功能列表,它可以帮助您防止意外提交不应提交的本地更改文件(在提交对话框中,右键单击文件=>移动到更改列表 - > ignore-on-commit)。如果您确实需要更改.config文件中的其他内容,可能会有点烦人,但仍然。

答案 1 :(得分:3)

简单:不要将连接字符串放在代码中,从某处的配置数据中读取它。然后就是不要把配置数据放在Subversion中。

在我现在正在处理的应用程序中,我们将连接字符串信息存储在Windows注册表中的HKLM \ Software \ [OurProduct] \ Database中。

答案 2 :(得分:3)

你不能在家更改.config而不是检查对连接字符串的更改吗?

在代码中保存连接字符串信息是不好的做法(任何人都可以使用ildasm.exe并查看代码中的所有字符串)。

此类信息应处于您可以更好地控制的配置中。

此外,如果需要,.NET支持encryption of the connection string section

答案 3 :(得分:1)

我认为理想的解决方案是使用像Visual Studio 2010中添加的web.config transforms之类的东西。不幸的是,据我所知,这些只适用于web.config文件。

答案 4 :(得分:0)

在源代码管理中,使用app.config中用于最常用连接字符串的连接字符串(可能正常工作)。

在家中,劫持(或结帐)选择要使用哪个连接字符串的文件,然后对其进行编辑以使用您的家庭连接字符串。

答案 5 :(得分:0)

您可以使用设置来定义多个连接字符串。只需双击解决方案资源管理器中的Settings.settings-> project-> Properties。然后你会看到包含设置类型的组合框。选择ConnectionString然后输入connstr。

然后你可以用下面的代码获得connstr

using System.Configuration;

using test.Properties;

namespace test{
public partial class mainForm : Form{

   public mainForm()

    {
        InitializeComponent();            

    }

    private void mainForm_Load(object sender, EventArgs e)
    {
        string connectionStr = ConfigurationManager.ConnectionStrings[this_index_is_up_to your_algorithm].ToString();
    }
}

}

答案 6 :(得分:0)

.NET有一种方法可以使用file属性覆盖一个配置文件中的设置与另一个配置文件中的设置。我们通常做这样的事情:

<强>的web.config

<configuration>
    <appSettings file="web.custom.config">
        <!-- your default settings here -->
    </appSettings>
</configuration>

<强> web.custom.config

<appSettings>
    <!-- override stuff from root web.config here here -->
</appSettings>

按照惯例,我们设置源代码控制系统[SVN]以忽略任何custom.config文件。这允许我们签入核心默认设置,同时仍然允许每个开发人员管理特定于环境的设置。

注意:这仅适用于<appSettings>键。如果您要在<connectionStrings>键中存储连接字符串,请考虑将这些设置移至appSettings。

请参阅http://msdn.microsoft.com/en-us/library/ms228154.aspx

答案 7 :(得分:0)

对我来说,关于使用包含名称 runner 的 gitlab ci,以下内容就足够了。

public static string GetConnectionString(IConfiguration configuration)
        {
            if (Environment.MachineName.Contains("runner"))
            {
                return configuration.GetConnectionString("DatabasePipeline");
            }
            return configuration.GetConnectionString("DatabaseLocal");
        }

您可以指定尽可能多的情况,因为您的环境必须使用不同的连接字符串。