切换或选择数据库服务器的连接字符串最佳实践

时间:2016-04-08 09:10:49

标签: sql-server vb.net windows

我正在开发一种将在不同位置使用不同服务器的软件。它在服务器名称,数据库名称等方面有所不同。

示例:

  • 位置1:服务器名称:ChinaServer;数据库名称:ChinaDB
  • 位置2:服务器名称:USServer;数据库名称:USDB

目前,我正在使用.ini文件,我将服务器名称,数据库名称和其他配置存储到它。我读了它并使用它运行时我的连接字符串。这里的问题是每次切换位置时,​​我都需要更改/编辑.ini文件。

我问每个有更多经验的人,我会在这件事上给我其他选择或最佳方法。

  • 客户环境:Windows 7
  • 开发人员:Windows 7,Visual Studio 2015,MS SQL,VB.NET

感谢IA。

3 个答案:

答案 0 :(得分:0)

有几种方法,每种方法各有优缺点,配置文件都可以工作,也可以将它存储在服务器的注册表中并以这种方式读取。或者您甚至可以使用可在设置页面中更新的My.Setting变量(可能不是最适合您的情况)

答案 1 :(得分:0)

您可以从The Twelve-Factor App"宣言"中获取基本想法:

  

十二因素应用程序将配置存储在环境变量中......

所以你需要的是建立一个机器范围的(setx /M NAME VALUE)环境变量,你以后会像这样使用它:

var connectionString = Environment.GetEnvironmentVariable("MY_APP_CONNECTION_STRING");
var dbContext = new DbContext(connectionString);

答案 2 :(得分:0)

您可以在System.Data.Sql中使用SQL Server枚举器,并运行查询以获取数据库名称。从那里将这些列表绑定到组合框,并使用SqlConnectionStringBuilder跟踪您的连接设置。您可以将它们保存到磁盘,或者只是要求用户选择服务器和数据库。请注意,并不保证枚举器始终可以找到所有服务器,因此请确保您可以在必要时手动输入它。

    private SqlConnectionStringBuilder _connString = new SqlConnectionStringBuilder();


    private void RefreshConnectionString()
    {
        _connString.ApplicationName = AppDomain.CurrentDomain.ApplicationIdentity.FullName;
        _connString.ApplicationIntent = ApplicationIntent.ReadWrite;
        _connString.DataSource = GetSqlDatasources().FirstOrDefault();
        _connString.InitialCatalog = GetSqlDatabases().FirstOrDefault();
        _connString.AsynchronousProcessing = true;
        _connString.ConnectTimeout = 5;
        _connString.IntegratedSecurity = true;
        _connString.Pooling = true;
    }

    private IEnumerable<string> GetSqlDatabases()
    {
        using (var conn = new SqlConnection(_connString.ConnectionString))
        {
            using (var cmd = new SqlCommand(@"SELECT [name] FROM sys.databases WHERE [name] NOT IN ('master', 'model', 'msdb', 'tempdb')", conn))
            {
                var dbnames = new List<string>();
                try
                {
                    conn.Open();
                    var reader = cmd.ExecuteReader();
                    while (reader.Read()) dbnames.Add(reader.GetString(0));
                }
                catch {}
                return dbnames;
            }
        }
    }

    private IEnumerable<string> GetSqlDatasources()
    {
        var sqlEnum = SqlDataSourceEnumerator.Instance;
        return sqlEnum.GetDataSources().Rows.OfType<DataRow>().Select(row => row[0].ToString());
    }