C# SqlDataAdapter关闭连接方法

C# SqlDataAdapter关闭连接方法,c#,sql-server,dataset,sqldataadapter,C#,Sql Server,Dataset,Sqldataadapter,我的程序中有这样一个代码,我相信在数据被填充之后,它不会关闭连接 public static string ConnectionInfo = System.Configuration.ConfigurationManager.ConnectionStrings["Default"].ConnectionString; public static DataTable ExecuteQuery(string query, string table) { SqlConnecti

我的程序中有这样一个代码,我相信在数据被填充之后,它不会关闭连接

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

此代码中有任何问题吗?

添加一个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];
        }
    }

唯一的问题是,您没有为
SqlConnection
DataAdapter
使用
using
语句。但是,会隐式打开和关闭连接

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)
    ,因为您使用的是单个表

编辑:我刚刚注意到您正在使用一个参数作为表名。您也可以使用。这不会改变任何事情。

无论连接的打开/关闭如何,都应该在try-catch-finally块中完成

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

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

    }

您是否确实在某处关闭了连接?
cnn.close()
或使用
关闭连接?请参阅此链接“/>我认为第二个
using
语句必须包含在第一个括号中。@AlbertoSolano:不,第二个using由于大括号而被视为单个语句,因此它是第一个using的一部分(类似于此
if
if(true)if(true){;}
)。啊,我理解了,谢谢。我从未尝试过这种方法。为了更好的可读性,我总是在一行中使用括号。:-)@阿尔贝托索拉诺:这是口味的问题,但我更喜欢这种方法,因为它可以防止压痕。考虑到更多的一次性对象,比如“代码> Sql命令< /代码>,那么您已经有三个意图,相关代码将滚动到视线之外。
SqlConnection
初始化不有趣。这就是为什么我总是省略大括号。“我们不应该使用using块,因为如果网络出现问题或任何异常导致连接未关闭”,这完全是错误的,
SqlConnection.Dispose
将隐式调用
Close
,即使出错也是如此。所以实际上,一个简单的
using
语句将被翻译成您的
try/finally