SqlDataAdapter关闭连接方法

时间:2013-11-20 09:07:15

标签: c# sql-server dataset sqldataadapter

我的程序中有这样的代码,我相信在数据填满之后它没有关闭连接。

public static string ConnectionInfo = System.Configuration.ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
public static DataTable ExecuteQuery(string query, string table)
    {
        SqlConnection cnn = new SqlConnection(ConnectionInfo);
        SqlDataAdapter Adp = new SqlDataAdapter(query, cnn);
        DataSet Ds = new DataSet();
        Adp.Fill(Ds, table);
        return Ds.Tables[table];
    }

此代码有问题吗?

3 个答案:

答案 0 :(得分:4)

唯一的问题是您没有对usingSqlConnection使用DataAdapter语句。但是,DbDataAdapter.Fill会隐式打开和关闭连接。

public static DataTable ExecuteQuery(string query, string table)
{
    using(SqlConnection cnn = new SqlConnection(ConnectionInfo))
    using(SqlDataAdapter Adp = new SqlDataAdapter(query, cnn))
    {
        DataTable tbl = new DataTable();
        Adp.Fill(tbl);
        return tbl;
    }
}
  

与SELECT语句关联的连接对象必须是   有效,但不需要打开。如果连接已关闭   在调用Fill之前,它会打开以检索数据,然后关闭。如果   在调用Fill之前连接已打开,它仍保持打开状态。

请注意

  • using语句即使出错也会隐式关闭连接
  • 我使用了DataAdapter.Fill(DataTable)因为你正在使用单个表

编辑:我刚才注意到您正在使用表名的参数。您也可以使用DbDataAdapter.Fill(DataSet, String)代替。这不会改变任何事情。

答案 1 :(得分:0)

添加using语句以便可靠地关闭连接。这可确保即使发生异常也会关闭连接。按如下方式更改您的代码:

public static DataTable ExecuteQuery(string query, string table)
    {
        using(SqlConnection cnn = new SqlConnection(ConnectionInfo))
        {
            SqlDataAdapter Adp = new SqlDataAdapter(query, cnn);
            DataSet Ds = new DataSet();
            Adp.Fill(Ds, table);
            return Ds.Tables[table];
        }
    }

答案 2 :(得分:-1)

无论是在try-catch-finally块中进行连接的打开/关闭。

我们不应该使用“使用” [ using(SqlConnection connection = new SqlConnection(connectionString))] 块。因为如果网络出现问题或任何异常原因。连接未关闭。所以最好使用try-catch块。

    public static DataTable ExecuteQuery(string query, string table)
    {
        DataSet Ds = new DataSet();

        SqlConnection cnn = new SqlConnection(ConnectionInfo);

        try{
            SqlDataAdapter Adp = new SqlDataAdapter(query, cnn);
            Adp.Fill(Ds, table);
            return Ds.Tables[table]; 
        }
        catch{
            throw;
        }
        finally{
            cnn.Close();
        }

    }