.NET Core 查询Oracle BLOB字段报错:TTC Error,转换成base64

.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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值