System.Data.SqlClient.SqlConnection неожиданный результат в методе Open () с неполным ConnectionString - PullRequest
0 голосов
/ 04 декабря 2018

При вызове метода Open() для экземпляра SqlConnection, который получил неполную строку подключения, метод не вызывает исключение.

Я создал следующий пример, чтобы продемонстрировать свою проблему.

var success = true;

var connectionStrings = new[]
        {
            "Integrated Security=SSPI;",
            "Initial Catalog=awdemo;Integrated Security=SSPI;",
            "Data Source=.\\sql2016;Initial Catalog=awdemo;Integrated Security=SSPI;"
};

foreach (var connectionString in connectionStrings)
{
    var conn = new SqlConnection(connectionString);

    try
    {
         conn.Open();
    }
    catch (Exception)
    {
        success = false;
    }
    finally
    {
        conn.Close();
        Console.WriteLine($"{connectionString} - Success = {success}");
    }
}

Результат:

Integrated Security=SSPI; - Success = True
Initial Catalog=awdemo;Integrated Security=SSPI; - Success = True
Data Source=.\sql2016;Initial Catalog=awdemo;Integrated Security=SSPI; - Success = True

Я бы ожидал, что conn.Open() сгенерирует исключение для первых двух строк подключения, поскольку обе они являются неполными и недействительными.

Почему не генерируется исключение?

РЕДАКТИРОВАТЬ: как указано Стивом в комментариях, исключение не генерируется, поскольку компонент подключается к моему экземпляру SQL Server по умолчанию, когда сервер не предоставляется.Информация.

Есть ли способ заставить компонент SqlConnection выдать ошибку в неполных строках соединения?В приложении возможно и разрешено создавать неполные строки подключения.

1 Ответ

0 голосов
/ 04 декабря 2018

Нет практического способа полностью это подтвердить.У вас может быть строка подключения, содержащая все ожидаемые компоненты, включая действительный сервер и имя базы данных, но это неправильный сервер или неправильная база данных.

Таким образом, если ожидается, что класс завершится с ошибкой на conn.Open(), если строка подключения неверна (не недействительна, но неверна), вы не сможете достичь этого полностью.

Имеет ли это значение?Представьте себе несколько сценариев, каждый из которых содержит неверные строки подключения:

  1. Строка подключения "blarg!"и поэтому попытка открыть соединение выдает исключение.
  2. Строка соединения не содержит имя сервера или базы данных.Вы можете открыть соединение, но когда вы попытаетесь выполнить какую-либо команду, это не удастся.
  3. Строка соединения содержит имя сервера и базы данных, но это неправильный сервер или база данных.Сбой по той же причине, что и 2.

В каждом из сценариев, что в первую очередь вы собираетесь сделать?Вы собираетесь посмотреть на исключение.Независимо от того, какая строка ее выбрасывает, вы быстро обнаружите, что у вас неверная строка подключения.

Таким образом, «проверка», которая не может на самом деле проверить строку подключения перед ее открытием, простодобавить работу.Если строка подключения неверна, это действительно «исключительное» условие, поэтому, вероятно, лучше просто позволить коду генерировать исключение там, где это происходит.Вы найдете проблему быстро.

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

// Maybe give it a better name.
public static void ValidateThatConnectionHasDataSourceAndDatabase(this SqlConnection connection)
{
    if (string.IsNullOrEmpty(connection.DataSource)) 
        throw new Exception("The connection has no datasource");
    if (string.IsNullOrEmpty(connection.Database)) 
        throw new Exception("The connection has no database");
}

После того, как вы создадите соединение и перед тем, как его открыть, вызовите conn.ValidateThatConnectionHasDataSourceAndDatabase();

...