繁体   English   中英

来自另一个类的数据库连接

[英]Database Connection from another class

我在程序中创建了一个类来处理数据库连接。 此类包括一个名为OpenConnection()的方法,用于打开与数据库的连接。 我不相信我的程序符合干净代码的标准。 这是方法。

public void OpenConnection()
{
  if(connection==null || connection.State != Connection.Open)
  {
     connection = new OracleConnection(this.connectionString);
     connection.Open();
  }
}

这种方法可以正常工作,但我只想确保这是否安全,并且我不会以任何方式利用我的程序。 先感谢您

更新

我还在类中添加了以下方法以关闭连接并进行处理。

    public void CloseConnection()
    {
        if (dbconnect != null | dbconnect.State != ConnectionState.Closed)
        {
            dbconnect.Close();
        }
    }

    //Here the IDsiposable method is implemented
    public void Dispose()
    {
        CloseConnection();
    }

您可以使用using子句,它将自动处理Dispose。

using (SqlConnection connection = new SqlConnection(connectionString))
    {

    connection.Open();
    SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add(new SqlParameter("@EmployeeID", 123));
    command.CommandTimeout = 5;

    command.ExecuteNonQuery();

    connection.close();
}

如果添加此答案中建议的用例,并且打算在单个线程上且在非常有限的范围内使用,则您的编码解决方案似乎可以 也就是说,您似乎正准备在许多方法调用中使用此类作为参数,因为您想

  • 混合业务逻辑和持久性关注
  • 或共享实例,而不必担心其他方法是否打开连接(例如,调用堆栈中的较高调用尚未调用Open )(例如,调用堆栈中的先前调用) 确实打开了连接(我们称之为“环境”连接))。

这些策略中的任何一种通常都会导致麻烦。 最好将作用域保持较小,知道连接处于打开状态以及何时关闭它:

using (var connection = new OracleConnection(...))
{
    connection.Open();
    ...
}

当您拥有如此小的范围时,您的抽象现在将毫无价值。

由于OracleConnection实现IDisposable,因此可能造成资源泄漏。 另外,在ConnectionState中的连接上调用close.Executing或Fetching可能很糟糕,因为它将回滚所有未提交的事务。

public void OpenConnection()
{
  if (connection == null)
  {
     connection = new OracleConnection(this.connectionString);
     connection.Open();
     return;
  }

  switch (connection.State)
  {
     case ConnectionState.Closed:
     case ConnectionState.Broken:
       connection.Close();
       connection.Dispose();
       connection = new OracleConnection(this.connectionString);
       connection.Open();
       return;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM