1

使用 SqlDataAdapter 执行命令后,与数据库的连接没有关闭。让我知道需要做什么。这是代码片段

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

让我知道可以做些什么来释放会话。

4

1 回答 1

2

Fill 方法使用关联的 SelectCommand 属性指定的 SELECT 语句从数据源中检索行。与 SELECT 语句关联的连接对象必须有效,但不需要打开。如果在调用 Fill 之前关闭连接,则打开它以检索数据,然后关闭。如果在调用 Fill 之前连接已打开,则它保持打开状态。

http://msdn.microsoft.com/en-us/library/377a8x4t.aspx

我强调了你的情况。您尚未打开连接,因此 DataAdapter 会自动为您打开它并在完成后关闭它。

编辑:如果你想自己管理连接,你应该在完成后立即关闭它。

因此,您可以使用using-statementwhich 处理/关闭它(即使出现异常)。

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:关闭连接并不意味着它在物理上是关闭的。这只是对 Connection-Pool 的提示,它可以再次使用。

ExecuteReader 需要一个打开且可用的连接。连接的当前状态是 Connecting

于 2012-07-27T09:38:22.167 回答