Я создаю веб-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();
}
}