Почему sqlConnection.Close () не закрывает логин? - PullRequest
3 голосов
/ 10 февраля 2011

У нас есть модульные тесты, чтобы проверить, успешно ли работают функции установки и удаления нашей базы данных. В модульных тестах используется класс SqlClient.SqlConnection для проверки содержимого базы данных до, во время и после.

Наша проблема заключается в том, что после использования SqlClient.SqlConnection часть drop login не удаляется, поскольку утверждает, что пользователь в данный момент вошел в систему. Даже если мы вызвали SqlConnection.Close (), логин, кажется, все еще открыт.

Наш код выглядит примерно так:

InstallTables();  // function uses smo to create tables in a database.
string connString = CreateLogin("userName", "password");  // create login with smo

// Test the returned connection string connects to the database
using (SqlConnection con = new SqlConnection(connString))
{
    con.Open();
    //test code to read the DB version out of a table
    //Dispose calls con.Close() - I have also tried calling it explicitly
}

DropTables();  // uses smo to drop tables from the database
DropLogin("userName", "password");   // uses smo to drop the login

Сбой DropLogin со следующим исключением: System.Data.SqlClient.SqlException: Не удалось отбросить имя входа «eng_ecurity_unittest_129418264074692569», поскольку пользователь в данный момент вошел в систему.

Если я удаляю весь код SqlConnection до окончания DropLogin, то все работает нормально.

Кто-нибудь знает, почему пользователь не вышел из системы, когда я вызываю SqlConnection.Close ()?

Это как-то связано с пулами соединений?

Ответы [ 2 ]

8 голосов
/ 10 февраля 2011

Если вы явно не отключили пул подключений в строке подключения, я предполагаю, что даже если вы удаляете соединение, оно еще живо в пуле подключений (на случай, если вы решите использовать его повторно):

Пул соединений с сервером SQL (ADO.NET)

Попробуйте отключить пул соединений (добавив Pooling=false; в строку подключения) и посмотрите, что произойдет.

2 голосов
/ 23 апреля 2014

Альтернативами Pooling=false являются SqlConnection.ClearPool и SqlConnection.ClearAllPools Метод .

...