teisipäev, 7. aprill 2009

SQLConnectionPooli tühjendamine

Juhul, näiteks, kui muudame SQL SERVER Logini parameetreid, näiteks Default Language siis võib juhtuda, et saame veateate
Resetting the connection results in a different state than the initial login. The login fails. Login failed for user 'MINE_KUULE'. A severe error occurred on the current command. The results, if any, should be discarded.

Põhjuseks on SQL Connection Pooli(basseini) olemasolu, mis peab meeles mis sätetega SQL SERVERI login basseini tuli ja kui vahepeal loginit muuta siis basseinis jääb see ju uuendamata. Kui nüüd teha uus päring andmebaasi siis Connection Pooli ja SQLSERVERI login ei lange enam parameetrite poolest kokku.
Lahti saab asjast nii, et tuleb bassein peale SQL SERVER logini muutmist tühjendada

Näiteks muudame SQL SERVER logini keelt süsteemse protseduuriga

EXECUTE sp_defaultlanguage @loginame = @login_name , @language = @lang_name

siis tema kasutamine koos pooli tühjendmisega näeb välja nii, ( DBO.SET_WORKER_LANGUAGE_KUIDO_U on üks enda tehtud salvestatud protseduur mille
sees ka seda sp_defaultlanguage kasutatakse)

using System.Data;
using System.Data.SqlClient;

using (SqlConnection Connection = new SqlConnection(Configuration.ConnectionString))
{
SqlCommand Command = new SqlCommand("DBO.SET_WORKER_LANGUAGE_KUIDO_U",Connection);
Command.CommandType=CommandType.StoredProcedure;
Command.Parameters.AddWithValue("@login_name", username.Trim());
Command.Parameters.AddWithValue("@lang_name", language.Trim());
Connection.Open();
Command.ExecuteNonQuery();
Connection.Close();
//basseini tühjendamine ainult selle ühenduse logini jaoks
SqlConnection.ClearPool(Connection);
// SqlConnection.ClearAllPools(); //kogu bassein tühjaks
}

Blogged with
the Flock Browser