System.ArgumentException: ключевое слово не поддерживается: «пароль» - PullRequest
0 голосов
/ 16 октября 2018

Мой код имеет механизм мониторинга работоспособности соединения с базой данных, который проверяет состояние соединения с базой данных и, если соединение разорвано, он пытается восстановить соединение через каждые 30 секунд.Во время повторных попыток он использует объект SqlConnection и назначает строку подключения для объекта перед вызовом метода Open.Соответствующая функция выглядит следующим образом.

public int Open(DBConnectionMode ConnectionMode, string server, string database, string user, string password) 
{
    try
    {
        SqlConnectionStringBuilder sqlconbuilder = new SqlConnectionStringBuilder();

        sqlconbuilder.DataSource = server;
        sqlconbuilder.InitialCatalog = database;

        if ((server != string.Empty) && (user == string.Empty))
            sqlconbuilder.IntegratedSecurity = true;
        else
            sqlconbuilder.IntegratedSecurity = false;

        sqlconbuilder.UserID = user;
        sqlconbuilder.Password = password;

        if (ConnectionMode == DBConnectionMode.LOCAL)
        {
            // oConnection is of type SqlConnection
            oConnection.ConnectionString = sqlconbuilder.ConnectionString; 
            oConnection.Open();
        }
        else
        {
            oConnectionRemote.ConnectionString = sqlconbuilder.ConnectionString;  
            oConnectionRemote.Open();

        }
        //update global connected indicator
        if (oCommand.Connection.State == ConnectionState.Open)
            isConnected = true;
        else
            isConnected = false;

        return 0;
    }
    catch (InvalidOperationException ex) 
    {
        return (int)DBErrorCode.CONNECTION_OPEN_INVALID_PARAMS;
    }
    catch (SqlException ex) 
    {
        return (int)DBErrorCode.CONNECTION_ERROR;
    }
    catch (Exception ex) 
    {
        throw (ex);
    }

}

Строка подключения, возвращаемая sqlconbuilder.ConnectionString, выглядит следующим образом.

Data Source=UK-NHAM-2016-01;Initial Catalog=ArcPubCfg;Integrated Security=False;User ID=sa;Password=xxxxxxx

Во время первых нескольких попыток ничего не происходит неправильно, но затем я запускаюполучаю следующую ошибку.

System.ArgumentException: Keyword not supported: 'password'

Я сузил ошибку до этой строки кода.

oConnection.ConnectionString = sqlconbuilder.ConnectionString;

Я подтвердил, что строка подключения остается той же.Как только я начинаю получать эту ошибку, она продолжает терпеть неудачу в этой строке.Я воссоздаю каждый релевантный объект заново во время каждой повторной попытки, но результат один и тот же.

Есть идеи, что может пойти не так?

Редактировать: Интересно то, чтопроблема не возникает, когда сервер SQL останавливается во время запуска моего приложения.Мое приложение продолжает попытки и не сталкивается с этой ошибкой.Как только соединение с базой данных установлено, а затем оно разрывается, механизм повторных попыток начинает получать эту ошибку через некоторое время.

1 Ответ

0 голосов
/ 23 октября 2018

После некоторого почесывания головы мне удалось решить проблему.

В основном, функция Open в моем вопросе вызывается из функции потока через каждые 30 секунд, чтобы попытаться восстановить соединение с базой данных.Функция потока выполняла цикл while с Thread.Sleep (30000) .Теперь я изменил это на таймер ( System.Timers.Timer ) вместо функции потока.Таймер срабатывает через каждые 30 секунд, чтобы вызвать функцию Open .Это решило проблему.

Я до сих пор не знаю, почему проблема действительно возникла и почему мое решение исправило это.Но пока это работает, я счастлив.

...