在下列情况下,Db连接会关闭吗?
本文关键字:连接 情况下 Db 在下列 | 更新日期: 2023-09-27 18:11:58
我对c#代码中创建的连接有疑问
要读取数据,我已经为所有读取的数据编写了Factory Class,如下所示
Public static OracleDataReader(CommandType ct,string command,params OracleParameter[] cp)
{
OracleConnection cn = new OracleConnection(getconnection());
try
{
return ExecuteReader(cn,ct,command,cp);
}
catch
{
cn.close();
}
}
现在我使用它如下
qry = "select * from emp";
using(IDataReader dr = OracleFacoty.ExecuteReader(CommandType.Text,qry,null)
{
while(dr.read())
{
//Do operation
}
}
现在我的问题是,在工厂方法中打开的连接是否会自动关闭,或者我需要通过调用方法的连接并关闭连接,一旦我完成了数据读取
using语句将在dB连接实例化时正确地处置dB连接,就像你所做的那样,从msdn中检查这个方法
您可以实例化资源对象,然后将变量传递给using语句,但这不是最佳实践。在这种情况下,在控制离开using块之后,对象仍然在作用域中,即使它可能不再有权访问其非托管资源。换句话说,它将不再被完全初始化。如果尝试在using块之外使用对象,则可能会引发异常。由于这个原因,通常最好在using语句中实例化对象,并将其作用域限制在using块中。
我建议可能使用using和实例化连接,并将该实例传递给您的工厂方法来执行任何操作,最后using将正确地处置数据库连接。
https://msdn.microsoft.com/en-us/library/yh598w02.aspxhttps://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection (v = vs.110) . aspx
通过查看您的代码,我可以说
- 你有一个静态方法在类创建新的连接每次你调用它,并返回一些数据表对象(?)
- 当
ExecuteReader()
发生错误时,异常被抑制,连接毫无疑问地关闭。
但是在第二段代码中,你没有使用OracleDataReader
,你直接调用ExecuteReader()
,我相信,不会处理任何异常。
同样,在第一个代码片段中,连接仅在发生错误时关闭。如果没有错误,连接将不会关闭,并且会导致内存泄漏,并且在尝试几次后将达到连接限制的最大值。
如果每次调用都需要新的连接,则将Cn.close()
放在finally{}
块中。