在下列情况下,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
    }
} 

现在我的问题是,在工厂方法中打开的连接是否会自动关闭,或者我需要通过调用方法的连接并关闭连接,一旦我完成了数据读取

在下列情况下,Db连接会关闭吗?

using语句将在dB连接实例化时正确地处置dB连接,就像你所做的那样,从msdn中检查这个方法

您可以实例化资源对象,然后将变量传递给using语句,但这不是最佳实践。在这种情况下,在控制离开using块之后,对象仍然在作用域中,即使它可能不再有权访问其非托管资源。换句话说,它将不再被完全初始化。如果尝试在using块之外使用对象,则可能会引发异常。由于这个原因,通常最好在using语句中实例化对象,并将其作用域限制在using块中。

我建议可能使用using和实例化连接,并将该实例传递给您的工厂方法来执行任何操作,最后using将正确地处置数据库连接。

https://msdn.microsoft.com/en-us/library/yh598w02.aspx

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection (v = vs.110) . aspx

通过查看您的代码,我可以说

  • 你有一个静态方法在类创建新的连接每次你调用它,并返回一些数据表对象(?)
  • ExecuteReader()发生错误时,异常被抑制,连接毫无疑问地关闭。

但是在第二段代码中,你没有使用OracleDataReader,你直接调用ExecuteReader(),我相信,不会处理任何异常。

同样,在第一个代码片段中,连接仅在发生错误时关闭。如果没有错误,连接将不会关闭,并且会导致内存泄漏,并且在尝试几次后将达到连接限制的最大值。

如果每次调用都需要新的连接,则将Cn.close()放在finally{}块中。

相关文章: