使用SqlDataAdapter执行命令后,与db的连接未关闭。让我知道需要做些什么。这是代码段
DataSet dsResult = new DataSet("Result");
SqlCommand selectCommand = new SqlCommand();
if (_datasource.DataType == DataType.SqlText)
{
selectCommand = GenerateCommand(_datasource.DataType,_sqlquery);
}
else
{
selectCommand = GenerateCommand(_datasource.DataType, _datasource.DataObjectName, _fieldNames, _filters);
}
SqlDataAdapter da = new SqlDataAdapter(selectCommand.CommandText, _datasource.ConnectionString);
da.Fill(dsResult);
dataset = dsResult;
尝试明确关闭连接,如da.SelectCommand.Connection.Close()。但问题没有得到解决。 还尝试了以下仍未解决的问题
using(SqlDataAdapter da = new SqlDataAdapter(selectCommand.CommandText, _datasource.ConnectionString))
{
da.Fill(dsResult);
}
让我知道如何释放会话。
答案 0 :(得分:2)
Fill方法使用SELECT从数据源中检索行 由关联的SelectCommand属性指定的语句。该 与SELECT语句关联的连接对象必须有效, 但它不需要打开。如果之前连接已关闭 调用填充,打开以检索数据,然后关闭。如果 在调用Fill之前连接已打开,它仍保持打开状态。
http://msdn.microsoft.com/en-us/library/377a8x4t.aspx
我突出了你的情况。您尚未打开连接,因此DataAdapter会自动为您打开它,并在完成后将其关闭。
修改:如果您想自己管理连接,应该在完成后立即关闭它。
因此,您可以使用处理/关闭它的using-statement
(即使出现异常)。
using(var con = new SqlConnection(_datasource.ConnectionString))
{
using(var da = new SqlDataAdapter(selectCommand.CommandText, con))
{
con.Open(); // not needed but ...
da.Fill(dsResult); // will not close the conection now
}
} // will close the connection
Edit2 :关闭连接并不意味着它是物理关闭的。它只是连接池的一个提示,它可以再次使用。