我的程序中有这样的代码,我相信在数据填满之后它没有关闭连接。
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];
}
此代码有问题吗?
答案 0 :(得分:4)
唯一的问题是您没有对using
和SqlConnection
使用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();
}
}