2011-02-10 6 views
3

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

Наша проблема заключается в том, что после использования SqlClient.SqlConnection, то падение Войти часть деинсталлировать терпит неудачу, потому что он утверждает, что пользователь в настоящее время вошли в систему. Даже если мы назвали 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: Невозможно удалить логин «engageSecurity_unittest_129418264074692569», как пользователь в настоящее время вошли в систему .

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

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

Это как-то связано с объединением соединений?

ответ

8

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

SQL Server Connection Pooling (ADO.NET)

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

+0

Thanks Justin - Pooling = false в строке подключения сделал трюк! – GarethOwen

+0

Рассмотрите возможность использования 'SqlConnection.ClearPool' вместо прямого отключения пула соединений. Взгляните на [ответ ниже] (http://stackoverflow.com/questions/4959885/why-does-sqlconnection-close-not-close-the-login/23243606#23243606), а также см. [Этот вопрос] (http://stackoverflow.com/questions/1145892/how-to-force-a-sqlconnection-to-physically-close-while-using-connection-pooling). – Livven

Смежные вопросы