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
。