Как устранить исключение «Недопустимая операция с закрытым объектом» при попытке чтения OracleDataReader - PullRequest
0 голосов
/ 10 июля 2019

Я создаю веб-API с использованием .Net Core и плагина Oracle.ManagedDataAccess.Core, который обращается к базе данных Oracle, чтобы получить поле Blob и вернуть его в виде байтового массива. Я создал функцию (getBlobfromDB), которая получает строку подключения Oracle из зашифрованного поля базы данных SQL, подключается и использует OraleDataReader для извлечения и возврата поля Blob. Но когда OraleDataReader пытается прочитать запись, я получаю следующее исключение: «Недопустимая операция с закрытым объектом».

При поиске по этой проблеме наиболее релевантным ответом является сообщение

Однако я на 100% уверен, что пользователь, используемый в строке conn, имеет доступ, так как он является владельцем схемы, и я также попытался добавить владельца схемы в запрос на выборку (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();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...