System.ObjectDisposedException:无法访问已处理的对象。对象名称:'OracleConnection' 重用 OracleConnection 对象

Saf*_*ari 3 c# oracle database-connection oraclecommand

我想重用一个 OracleConnection 对象来进行更多的查询,所以我写了一个简单的类:

public static class DbConnectionsManager
    {
        /// <summary>
        /// 
        /// </summary>
        private static OracleConnection _dbConnection = null;


        /// <summary>
        /// 
        /// </summary>
        /// <param name="aConnectionString"></param>
        /// <returns></returns>
        public static OracleConnection GetDatabaseConnection(string aConnectionString) 
        {
            try
            {
                if (_dbConnection == null)
                {
                    _dbConnection = new OracleConnection(aConnectionString);
                    _dbConnection.Open();
                    return _dbConnection;
                }

                if (_dbConnection.State == System.Data.ConnectionState.Closed)
                {
                    _dbConnection.ConnectionString = aConnectionString;
                    _dbConnection.Open();
                    return _dbConnection;
                }

                if (!_dbConnection.ConnectionString.Equals(aConnectionString))
                {
                    _dbConnection.Close();
                    _dbConnection.ConnectionString = aConnectionString;
                    _dbConnection.Open();
                    return _dbConnection;
                }

                return null;
            }
            catch (Exception e)
            {

                return null;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这样我可以多次使用连接:

  using (OracleConnection connection = 
           DbConnectionsManager.GetDatabaseConnection(aDbConnectionString))
            {
                OracleCommand command = connection.CreateCommand();
                string sql = "SELECT * FROM MYTABLE";
                command.CommandText = sql;

                OracleDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    string myField = (string)reader["EXAMPLE"];
                    Console.WriteLine(myField);
                }
            }
Run Code Online (Sandbox Code Playgroud)

当我第一次调用该方法时,一切正常。如果我记得该方法,静态对象是 != null 但连接结果已关闭!我从不关闭连接!

当您尝试重新打开连接时,我有此异常

....
if (_dbConnection.State == System.Data.ConnectionState.Closed)
                {
                    _dbConnection.ConnectionString = aConnectionString;
                    _dbConnection.Open();
                    return _dbConnection;
                }
...
Run Code Online (Sandbox Code Playgroud)

错误

Message = "Cannot access a disposed object.\r\nObject name: 'OracleConnection'."
Run Code Online (Sandbox Code Playgroud)

Pra*_*ana 6

正如错误所说,它是一个已处理的对象。这意味着您需要删除该using (条款;这个子句处理了你的连接对象,这就是为什么你不能在外面使用这个对象using (。这意味着如果你想在外面使用它,你需要创建一个新的类对象using (

请参阅: C# Using 语句