请帮忙!
背景资料
我有一个访问 SQL Server 2005 数据库的 WPF 应用程序。数据库在运行应用程序的机器上本地运行。
在我使用 Linq DataContext 的任何地方,我都使用 using { } 语句,并传入一个函数的结果,该函数返回一个已打开的 SqlConnection 对象,并在返回 DataContext 构造函数之前使用它执行了一个 SqlCommand。即
// 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 与 Sql Server Management Studio 中的 DataContext 一起被处理,但我仍然可以看到大量打开的连接:
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 被处置时,任何人都可以发现任何明显的东西会阻止连接被关闭和处置吗?