c# - System.ObjectDisposedException : Cannot access a disposed object. 对象名称: 'OracleConnection' OracleConnection 对象的重用

标签 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;
            }
        }
    }

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

  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);
                }
            }

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

当您尝试重新打开连接时出现此异常

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

错误

Message = "Cannot access a disposed object.\r\nObject name: 'OracleConnection'."

最佳答案

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

之外使用它

参见:C# Using Statement

关于c# - System.ObjectDisposedException : Cannot access a disposed object. 对象名称: 'OracleConnection' OracleConnection 对象的重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16077666/

相关文章:

c# - 如何指定继承实体中的属性类型?

java - 如何提高 java 应用程序从 oracle 数据库中获取大数据的性能?

sql - 用序列插入两个oracle表

sql - 错误 - ORA-22835 : Buffer too small for CLOB to CHAR or BLOB to RAW conversion

java - 在 Java 中关闭数据库连接

c# - 我可以发布在 .NET 中开发的软件的源代码作为 GPL 吗?

c# - 如何在 C++ 和 ??? 中合法地编写:::在 C# 中?

c# - MySQL 服务器可以从 C# 应用程序加载数据吗?

java - 将 JDBC 与 Oracle DB 一起使用时,如何查找连接是否真的超时或凭据是否错误?

c# - 在运行时创建类和项目的属性