为什么sqlConnection.Close()没有关闭登录?

时间:2011-02-10 16:32:37

标签: sql-server database-connection smo

我们有单元测试来测试我们的数据库安装和卸载功能是否成功运行。 单元测试使用 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:无法在用户当前登录时删除登录'engageSecurity_unittest_1294​​18264074692569'。

如果我在DropLogin之后删除所有SqlConnection代码,那么一切运行正常。

当我调用SqlConnection.Close()时,是否有人知道用户未注销的原因?

这与连接池有关吗?

2 个答案:

答案 0 :(得分:8)

除非您明确禁用连接字符串中的连接池,否则我的猜测是,即使您正在处理连接,它仍然在连接池中存活(如果您决定重新使用它):

SQL Server Connection Pooling (ADO.NET)

尝试禁用连接池(通过在连接字符串中添加Pooling=false;)并查看会发生什么。

答案 1 :(得分:2)

Pooling=false的替代方案是SqlConnection.ClearPoolSqlConnection.ClearAllPools Method