SQLConnection не полностью становится новым соединением с использованием нового ConsoleApp - PullRequest
0 голосов
/ 05 февраля 2012

Это трудно объяснить в названии.Я продолжаю цикл 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», даже если он находится во второй строке цикла.

Anyидеи?

О, я на самом деле не вызываю функцию Database, хотя stackoverflow выделен синим цветом.

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Код, который вы опубликовали, не вызывает получателя для изменения статической строки 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

0 голосов
/ 05 февраля 2012

Ваша проблема - статическая строка, инициализированная вне цикла.

Используйте локальную область видимости, возможно, что-то вроде этого.

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 могут быть использованы для нескольких.

...