.NET Core NuGet程序包:Oracle.ManagedDataAccess.Core 查询Oracle BLOB字段报错:TTC Error
查询blob的SQL语句在.NET FrameWork下并无异常,但用.NET Core NuGet程序包:Oracle.ManagedDataAccess.Core访问Oracle数据库时报:TTC Error 异常
解决思路:查询结果会把BLOB字段拆分为多行,每行2000个字节,程序按字段 OFFSET 顺序拼接起来即可
BLOB字段拆分的SQL代码:
SELECT DBMS_LOB.SUBSTR(O.FILE_CONTENT, 2000, O.OFFSET1) AS CONTENT,
O.OFFSET1,
O.MOD,
O.FILE_CONTENT_LENGTH,
O.INTERATION_COUNT
FROM (SELECT (2000 * (ROWNUM - 1)) + 1 AS OFFSET1,
I.MOD,
I.FILE_CONTENT_LENGTH,
I.INTERATION_COUNT,
i.FILE_CONTENT
FROM (SELECT dbms_lob.getlength(a.照片) AS FILE_CONTENT_LENGTH,
MOD(dbms_lob.getlength(a.照片), 2000) AS MOD,
CASE
WHEN MOD(dbms_lob.getlength(a.照片), 2000) > 0 THEN
TRUNC((dbms_lob.getlength(a.照片) / 2000) + 1)
ELSE
TRUNC(dbms_lob.getlength(a.照片) / 2000)
END INTERATION_COUNT,
a.照片 as FILE_CONTENT
FROM 人员照片 A
WHERE A.人员Id = 576) I
CONNECT BY LEVEL <= I.INTERATION_COUNT) o
order by OFFSET1
程序拼接,并转成Base64的C#代码
//取数据到databale
DataTable dtx = db.queryDatatable(sql);
List<byte> byteSource = new List<byte>();
byte[] arr = new byte[Convert.ToInt64(dtx.Rows[0]["FILE_CONTENT_LENGTH"].ToString())];
if (dtx.Rows.Count > 2)
{
for (int xx = 0; xx < dtx.Rows.Count; xx++)
{
byteSource.AddRange((byte[])dtx.Rows[xx]["CONTENT"]);
}
arr = byteSource.ToArray();
}
//转为Base64
string pic = Convert.ToBase64String(arr);