【问题标题】:Oracle CLOB and NCLOB require even number of bytesOracle CLOB 和 NCLOB 需要偶数字节
【发布时间】:2013-01-08 16:54:26
【问题描述】:

Asp.Net 4、C#、Oracle 11g

您好,我正在尝试将 html 文件的内容保存到 Oracle CLOB 列。 html 文件通过 asp:Upload 按钮上传到服务器。它大部分时间都工作正常,问题是有时按钮的 FileContent 属性处的流具有奇数字节,并且 clob 列的 Write 方法抛出异常,说明它需要偶数字节数

我该如何解决这个问题???有什么办法可以让我的 html 文件的字节数为偶数??? Html文件被编码为UTF8,改变编码确实会修改字节数,但仍然是偶数

提前致谢

编辑:现在,在流长度为奇数的情况下,我只是将缓冲区的大小增加 1,然后以自己的长度将流写入缓冲区,从而默认最后一个字节缓冲。请告知这样做的任何潜在错误:

var buffer = new byte[(stream.Length % 2 > 0? stream.Length + 1: stream.Length)];
stream.Read(buffer, 0, (int)stream.Length);
clob.Write(buffer, 0, buffer.Length);

再次感谢

编辑:以前的解决方案不起作用。新方法包括将流传递给字符串,在字符串末尾添加一个空格,然后再次转换为流。到目前为止它工作正常。抱歉,我无法发布代码……只是我不知道如何克服 StackOverflow 中代码 4 个空格的政策

【问题讨论】:

    标签: asp.net oracle11g clob


    【解决方案1】:

    我假设您使用的是 System.Data.OracleClient 类(而不是 Oracle 的 ODP.NET)。

    OracleLob 类没有编写字符串的方法,我希望它可以用于处理 CLOB。相反,文档说:

    适用于 Oracle 的 .NET Framework 数据提供程序处理所有 CLOB 和 NCLOB Unicode 格式的数据。因此,在访问 CLOB 和 NCLOB 数据类型时, 您总是在处理字节数,其中每个字符 是 2 个字节。例如,如果一个文本字符串包含三个 字符在 Oracle 服务器上保存为 NCLOB,其中 字符集是每个字符 4 个字节,并且您执行 Write 操作,您将字符串的长度指定为 6 个字节,尽管 它在服务器上存储为 12 个字节。

    在此上下文中,Unicode 表示 UTF-16 编码,大多数字符需要 2 个字节,辅助平面中的字符需要 4 或 6 个字节。

    所以如果你有一个字符串,你必须先将它转换为 UTF-16:

    byte[] utf16Bytes = Encoding.Unicode.GetBytes(str);
    clob.Write(utf16Bytes, 0, utf16Bytes.Lenght);
    

    或者您可以使用StreamWriter 来实现相同的目的:

    OracleLob clob = ...
    using (StreamWriter writer = new StreamWriter(clob, Encoding.Unicode))
    {
        writer.Write(str);
    }
    

    如果您的数据是 UTF-8 编码的字节数组,那么您必须将其转换为 UTF-16:

    byte[] utf8Data = ...
    byte[] utf16Data = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Data);
    clob.Write(utf16Data, 0, utf16Data.Length);
    

    【讨论】:

    • 嗨@Codo 是的,我正在使用OracleClient。目前,解决方案是将流转换为字符串,然后在末尾附加一个空格,以使其均匀。到目前为止它工作正常,他们正在测试它......如果它给你带来麻烦,我会尝试你的解决方案。谢谢
    • 您是否使用过 Toad 或 SQL Developer 或类似工具来确保数据以正确的形式到达数据库?
    • 嗨 @Codo 我使用 SQL 开发人员运行带有“dbms_lob.substr”的脚本,这样我就可以看到文件的内容。内容在应用程序发送时到达
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多