SQLConnection未完全成为使用新ConsoleApp的新连接

本文关键字:ConsoleApp 新连接 连接 SQLConnection | 更新日期: 2023-09-27 18:22:37

这个很难在标题中解释。我正在进行的是foreach循环,它为每个目标服务器和数据库设置一个新的连接字符串。然而,当foreach循环出现时,它会按预期设置字符串。然而,SqlConnection仍然会查看第一个字符串。

以下是我用来称之为连接的东西:

 foreach (string DatabaseConfig in DataHoldingClass.Server_Database_Config)
            {
                string[] splitConfig = DatabaseConfig.Split('|');
                //set sql connection config
                DataHoldingClass.Database = splitConfig[0];
                DataHoldingClass.SQLSERVER = splitConfig[1];
                //open specific config

                SQLProcessorClass.SQLMASTERCONNECTION =  SQLProcessorClass.OpenSQLConnection();
                //do some work here
                SQLProcessorClass.SQLMASTERCONNECTION.Dispose();
}

以下是我用来设置连接的内容:

public static string masterConString = "server="+DataHoldingClass.SQLSERVER+";database ="+DataHoldingClass.Database+";Trusted_Connection=Yes;persist security info=False;connection timeout=500";
    public static SqlConnection SQLMASTERCONNECTION { get; set; }
    public static SqlConnection OpenSQLConnection()
    {
        SqlConnection sqlCon = new SqlConnection(masterConString);
        sqlCon.Open();
        return sqlCon;
    }

下面是DataHoldingClass

  public static string Database { get; set; }
    public static string SQLSERVER { get; set; }

因此,例如,我的字符串DatabaseConfig="Database1|Server1",DataHoldClass.Server_Database_Config中的下一个循环是"Database2|Server2",当第二次循环发生时,即使它在循环的第二个字符串上,它也会继续使用"Database1| Server1"。

有什么想法吗?

哦,我实际上并没有调用Database函数,尽管stackoverflow用蓝色突出显示了它。

SQLConnection未完全成为使用新ConsoleApp的新连接

您发布的代码不会调用getter来更改静态字符串masterConString,因此将使用第一次创建SQLProcessorClass对象时创建的字符串,并保持设置为该字符串。

您可以简化为:

foreach (string DatabaseConfig in DataHoldingClass.Server_Database_Config) 
{ 
    string[] splitConfig = DatabaseConfig.Split('|');
    string connectionString = "server=" + splitConfig[1] + ";database =" + splitConfig[0] +
               ";Trusted_Connection=Yes;persist security info=False;connection timeout=500";
    using (SqlConnection cnn = new SqlConnection(connectionString))
    {
        cnn.Open();
        // do work....
    }
}

也许可以添加try/catch和一些检查,如splitConfig.Length >= 2

在循环外初始化的静态字符串是您的问题。

使用局部作用域,也许更像这样。

string connectionStringTemplate = "server={0};database={1};Trusted_Connection=Yes;persist security info=False;connection timeout=500";
foreach (string DatabaseConfig in DataHoldingClass.Server_Database_Config) {
  // is this string parsing really necessary - why not separate variables?
  string[] splitConfig = DatabaseConfig.Split('|'); 
  // 0=database and 1=server, apparently from above
  string connectionString = String.Format(connectionStringTemplate, splitConfig[1], splitConfig[0]); 
  using (SqlConnection cn = new SqlConnection(connectionString)) {
    //do some work here
  }
}

此外,这个控制台应用程序的全部目的可能是可以避免的。如果您在一台服务器上,请查看sp_msforeachdb以获得无c的解决方案。RedGate工具可以用于跨多个执行。