Oracle CLOB和NCLOB需要偶数个字节

时间:2013-01-08 16:54:26

标签: asp.net oracle11g clob

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

1 个答案:

答案 0 :(得分:2)

我假设您正在使用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);