尝试读取OracleDataReader时如何解决“对关闭的对象无效的操作”异常

时间:2019-07-10 20:39:32

标签: oracle .net-core

我正在使用.Net Core和Oracle.ManagedDataAccess.Core插件创建一个Web API,该插件访问Oracle数据库以检索Blob字段并将其作为字节数组返回。我创建了一个函数(getBlobfromDB),该函数从SQL数据库上的加密字段获取Oracle连接字符串,进行连接并使用OraleDataReader检索并返回Blob字段。但是,当OraleDataReader尝试读取记录时,出现此异常:“对关闭的对象无效的操作”。

搜索此问题时,最相关的答案是post

但是,我100%确信使用conn字符串的用户可以访问,因为那是架构所有者,而且我还尝试将架构所有者添加到Select查询中(SELECT FIELD FROM SCHEMA_OWNER.TABLE WHERE ID = “”)出现相同的错误

因此,我尝试了另外两件事,即从同一数据库中的另一个表获取了不同的VARCHAR字段,仍然遇到了相同的错误;并尝试使用其他Oracle数据库后,我能够成功检索数据,因此我认为conn字符串或服务器设置有问题,也许是吗?我不知道我还能做什么或尝试什么,我会很感激您能给我的任何帮助/建议

这是简化功能

private OracleBlob getBlobfromDB(string sSystem, string sID)
        {
            string sSQL = String.Empty;
            string connString = String.Empty;
            OracleConnection oConn = new OracleConnection();

            if (string.IsNullOrWhiteSpace(sID) || string.IsNullOrWhiteSpace(sSystem) )
            {
                return null;
            }          

            sSQL = "SELECT BLOB_FIELD FROM TABLE WHERE ID = " + sID;
            connString = getConnectionString(sSystem); 

            try
            {
                using (oConn = new OracleConnection(connString))
                { 
                    oConn.Open();
                    OracleCommand oCom = new OracleCommand(sSQL, oConn);                   

                    OracleDataReader oDr = oCom.ExecuteReader();                    
                    if (oDr.HasRows)
                    {      
                        //I'm able to reach to this point before getting the exception
                        oDr.Read();
                        OracleBlob blob = oDr.GetOracleBlob(0);                        
                        // Clean up
                        oDr.Close();
                        oDr.Dispose();
                        oCom.Dispose();
                        return blob;
                    }
                    else
                    {
                        // Clean up
                        oDr.Close();
                        oDr.Dispose();
                        oCom.Dispose();
                        return null;
                    }

                }
            }
            catch (Exception x)
            {
                return null;
            }
            finally
            {
                oConn.Close();
            }
        }

0 个答案:

没有答案