Oracle CLOB和NCLOB需要偶数个字节



Asp.Net 4,C#,Oracle 11g

嗨,我正在尝试将html文件的内容保存到OracleCLOB列中。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个空格的策略

我假设您使用的是System.Data.OracleClient类(与Oracle的ODP.NET相反(

OracleLob类没有用于编写字符串的方法,我希望它用于处理CLOB。相反,文件上写着:

用于Oracle的.NET Framework数据提供程序处理所有CLOB和NCLOB数据为Unicode。因此在访问CLOB和NCLOB数据类型时,您总是处理字节数,其中每个字符是2个字节。例如,如果一个包含三个字符在Oracle服务器上另存为NCLOB字符集为每个字符4个字节,并且执行写入操作中,您将字符串的长度指定为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);

最新更新