2012-02-05 1 views
0

Это трудно объяснить внутри заголовка. Я продолжаю цикл foreach, который устанавливает новую строку соединения для каждого целевого сервера и базы данных. Однако, когда цикл foreach приходит, он задает строку, как предполагалось, однако SqlConnection продолжает смотреть на первую строку.SQLConnection не полностью становится новым подключением, используя новый ConsoleApp

Ниже то, что я использую, чтобы вызвать соединение:

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_Data base_Config - «Database2 | Server2», когда цикл происходит во второй раз, он продолжает использовать «Database1 | Server1», даже если он находится во второй строке цикла.

Любые идеи?

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

ответ

1

Код, который вы отправили, не вызывает геттер, чтобы изменить статическую строку 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/поймать, а некоторые проверки, такие как splitConfig.Length >= 2

+0

как бы вы порекомендовали? –

+0

Да, к сожалению, что класс SQL, у которого есть соединение, потребует значительного изменения для большого количества кода. Мне нужно сохранить его там, что легко сделать, чтобы установить его в коде, который у меня сверху. –

+0

, если вы хотите сохранить сложный код (а если он не был, то эта ошибка, вероятно, не произошла бы), это ваш выбор. Создание оболочки вокруг соединений и создание кода, который не создает соединение, ответственное за его закрытие, может привести к проблемам. Мне нравится держать вещи простыми. Кроме того, вам не нужно менять много кода, если все, что вы хотите сделать, - это упростить введенный вами код; просто используйте что-то похожее на то, что я разместил. –

0

Статической строки инициализированной вне цикла вашей проблемы.

Используйте локальный масштаб, возможно, что-то более похожее на это.

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