2011-02-10 16 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_1294​​18264074692569」を削除できませんでした

すべてのSqlConnectionコードをDropLoginの後に削除すると、すべて正常に動作します。

誰かがSqlConnection.Close()を呼び出したときにユーザーがログアウトしない理由を知っていますか?

これは接続プーリングと関係がありますか?

答えて

8

接続文字列で明示的に接続プールを無効にしていない限り、接続を廃棄しても接続プールにはまだ残っています(再利用する場合)。

SQL Server Connection Pooling (ADO.NET)

(接続文字列でPooling=false;を追加することで)接続プーリングを無効にしてみてくださいと何が起こるかをご覧ください。

+0

ありがとう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

関連する問題