Пожалуйста, помогите!.net SqlConnection не закрывается даже при использовании {}
Справочная информация
У меня есть приложение WPF, который получает доступ к базе данных SQL Server 2005. База данных выполняется локально на компьютере, на котором запущено приложение.
Всюду, где я использую Linq DataContext, я использую оператор {} и передаю результат функции, которая возвращает объект SqlConnection, который был открыт, и выполнил его с помощью SqlCommand, прежде чем вернуться к конструктору DataContext .. Т.е.
// In the application code
using (DataContext db = new DataContext(GetConnection()))
{
... Code
}
где GetConnection выглядит следующим образом (я раздел на «пушок» из функции, чтобы сделать его более удобным для чтения, но нет никакой дополнительной функциональности, которая отсутствует).
// Function which gets an opened connection which is given back to the DataContext constructor
public static System.Data.SqlClient.SqlConnection GetConnection()
{
System.Data.SqlClient.SqlConnection Conn = new System.Data.SqlClient.SqlConnection(/* The connection string */);
if (Conn != null)
{
try
{
Conn.Open();
}
catch (System.Data.SqlClient.SqlException SDSCSEx)
{
/* Error Handling */
}
using (System.Data.SqlClient.SqlCommand SetCmd = new System.Data.SqlClient.SqlCommand())
{
SetCmd.Connection = Conn;
SetCmd.CommandType = System.Data.CommandType.Text;
string CurrentUserID = System.String.Empty;
SetCmd.CommandText = "DECLARE @B VARBINARY(36); SET @B = CAST('" + CurrentUserID + "' AS VARBINARY(36)); SET CONTEXT_INFO @B";
try
{
SetCmd.ExecuteNonQuery();
}
catch (System.Exception)
{
/* Error Handling */
}
}
return Conn;
}
Я не думаю, что приложение WPF быть один имеет какое-либо отношение к этому вопросу у меня возникли.
Проблема, которую я имею
Несмотря на SqlConnection расположены вместе с DataContext в студии управления Sql Server я до сих пор можно увидеть кучу открытых соединений с:
status : 'Sleeping'
command : 'AWAITING COMMAND'
last SQL Transact Command Batch : DECLARE @B VARBINARY(36); SET @B = CAST('GUID' AS VARBINARY(36)); SET CONTEXT_INFO @B
В конце концов соединения пул истощается, и приложение не может продолжаться.
Поэтому я могу только заключить, что каким-то образом запуск SQLCommand для установки Context_Info означает, что соединение не удаляется, когда DataContext удаляется.
Может ли кто-нибудь заметить что-либо очевидное, что будет прекращать соединение из-за закрытия и удаления, когда используется DataContext, который они используют?
Вы можете просто добавить частичный класс для расширения автоматически генерируемого контекста данных; нет необходимости в подклассе. – 2008-11-06 15:10:22