0

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 个空格的政策

4

1 回答 1

3

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

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

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

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

因此,如果您有一个字符串,则必须先将其转换为 UTF-16:

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

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

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);
于 2013-01-08T19:02:52.943 回答