首页 > 解决方案 > .NETCore Oracle ManagedDataAccess 客户端:无法读取 BLOB(TTC 错误)

问题描述

我有 .NET Core 应用程序,我们正在尝试使用 Oracle 托管数据访问客户端(目前它只有 beta 版)。

但是,当我从数据库中读取 BLOB 时,它会出现“TTC 错误”。有谁知道如何进行?

using (OracleConnection conn = new OracleConnection("Data Source=db;User ID=userid;Password=pass;Pooling=False;"))
{
    conn.Open();
    var sql = "SELECT id, blobdata FROM templ";
    OracleCommand cmd = new OracleCommand(sql, conn);
    cmd.CommandType = CommandType.Text;
    OracleDataReader reader = cmd.ExecuteReader();
    using (reader)
    {
         while (reader.Read()) //TTC Error
         {
         }
    }

“TTC 错误”是主要的异常消息。

标签: oracle.net-coreblob

解决方案


这并不理想,但我今天遇到了这个问题并最终使用 DBMS_LOB.SUBSTR 函数以 2000 的卡盘读取它(2000 是 RAW 可以达到的最大)。

下面是一个查询,它返回一行,其中每一行是文件在特定偏移量处的 2K 块。

WITH
INFO
AS
(
    SELECT
        dbms_lob.getlength(A.FILE_CONTENT) AS FILE_CONTENT_LENGTH, 
        MOD(dbms_lob.getlength(A.FILE_CONTENT),2000) AS MOD,
        CASE
            WHEN MOD(dbms_lob.getlength(A.FILE_CONTENT),2000) > 0 THEN TRUNC((dbms_lob.getlength(A.FILE_CONTENT)/2000) + 1)
            ELSE TRUNC(dbms_lob.getlength(A.FILE_CONTENT)/2000)
        END INTERATION_COUNT,
        A.FILE_CONTENT,
        A.FILE_ID
      FROM TABLE_OF_FILES A WHERE A.FILE_ID = 345321561
)
,OFFSETS AS
(
    SELECT
        (2000 * (ROWNUM-1)) + 1 AS OFFSET,
        I.MOD,
        I.FILE_CONTENT_LENGTH,
        I.FILE_CONTENT,
        I.FILE_ID,
        I.INTERATION_COUNT
    FROM INFO I
    CONNECT BY LEVEL <= I.INTERATION_COUNT
)
,RESULT AS
(
    SELECT
        DBMS_LOB.SUBSTR(O.FILE_CONTENT, 2000, O.OFFSET) AS CONTENT,
        O.OFFSET,
        O.MOD,
        O.FILE_CONTENT_LENGTH,
        O.FILE_ID,
        O.INTERATION_COUNT
    FROM OFFSETS O
)
SELECT * FROM RESULT R ORDER BY R.OFFSET ASC;

推荐阅读