使用SqlDataAdapter时连接未关闭

时间:2012-07-27 09:33:20

标签: ado.net

使用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);
}

让我知道如何释放会话。

1 个答案:

答案 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 :关闭连接并不意味着它是物理关闭的。它只是连接池的一个提示,它可以再次使用。

ExecuteReader requires an open and available Connection. The connection's current state is Connecting