我正在使用 .Net Core 和 Oracle.ManagedDataAccess.Core 插件创建一个 Web API,该 API 访问 Oracle 数据库以检索 Blob 字段并将其作为字节数组返回。我创建了一个函数(getBlobfromDB),该函数从 SQL 数据库的加密字段中获取 Oracle 连接字符串,连接并使用 OraleDataReader 检索和返回 Blob 字段。但是当 OraleDataReader 尝试读取记录时,我收到了这个异常:“在关闭的对象上进行无效操作”。
当您搜索此问题时,最相关的答案是此 post。
然而,我百分之百确定连接字符串上的用户具有访问权限,因为那是模式所有者,并且我还尝试将模式所有者添加到 Select 查询中(SELECT FIELD FROM SCHEMA_OWNER.TABLE WHERE ID =“”),但仍然出现相同的错误。
所以我尝试了另外两件事情,从同一数据库中的另一个表获取不同的VARCHAR字段,仍然出现相同的错误;并在不同的Oracle数据库上尝试,我能够成功地检索数据。我注意到服务器上的Oracle版本不同,工作的版本为12.2,而不工作的版本为11.2,这可能是原因?我不知道还能做或尝试什么,我将感激任何您能给我的帮助/建议。
这是简化的函数。
当您搜索此问题时,最相关的答案是此 post。
然而,我百分之百确定连接字符串上的用户具有访问权限,因为那是模式所有者,并且我还尝试将模式所有者添加到 Select 查询中(SELECT FIELD FROM SCHEMA_OWNER.TABLE WHERE ID =“”),但仍然出现相同的错误。
所以我尝试了另外两件事情,从同一数据库中的另一个表获取不同的VARCHAR字段,仍然出现相同的错误;并在不同的Oracle数据库上尝试,我能够成功地检索数据。我注意到服务器上的Oracle版本不同,工作的版本为12.2,而不工作的版本为11.2,这可能是原因?我不知道还能做或尝试什么,我将感激任何您能给我的帮助/建议。
这是简化的函数。
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();
}
}