调用存储过程,或者拼语句都可以.使用存储过程的情况下,出现错误:ora-01460 转换请求无法实现或不合理。代码如下:create or replace procedure SP_FIELD_TEST_2(pFormID in number,pClob in clob, pNClob in nclob) is
begin
   INSERT INTO TB___TEST VALUES(pFormID,pClob,pNClob);
end SP_FIELD_TEST_2;// 此处省略非关键代码
 OracleParameter[] parameters = {
new OracleParameter("pFormID", OracleType.Number),
new OracleParameter("pClob", OracleType.Clob),
new OracleParameter("pNClob", OracleType.NClob)
};            parameters[0].Value = 123;
            parameters[1].Value = "超过32K的字符串";
            parameters[2].Value = "超过32K的字符串";            int temp = DbHelperOra.RunProcedure("SP_FIELD_TEST_2", parameters);
// 此处省略非关键代码public static int RunProcedure(string storedProcName, IDataParameter[] parameters)
        {
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                int rowsAffected;                OracleCommand command = new OracleCommand(storedProcName, connection);
                command.CommandText = storedProcName;//声明存储过程名
                command.CommandType = CommandType.StoredProcedure;
                foreach (OracleParameter parameter in parameters)
                {
                    command.Parameters.Add(parameter);
                }
                connection.Open();
                rowsAffected = command.ExecuteNonQuery();
                connection.Close();
                return rowsAffected;
            }
        }
使用语句没有验证过,网上的说法是可以大于4000,但无法超过32K。另外,ODP.NET能保证插入长度超过32K的clob不出问题吗?

解决方案 »

  1.   

    统观网上的说法,原因主要有几下几种:
    1、服务器端的字符集和客户端不匹配。
    这里客户端具体是指什么呢?比如我用instantclient-basic-nt-11.2.0.2.0连接的,怎么查询和配置它的字符集?
    2、System.Data.OracleClient的bug,对blob\clob处理存在bug,MS已经放弃支持了。解决建议有:
    1、换ODP.NET库。
    这个改动太大,能避免则避免。
    2、程序负责拆分,多次插入。这个也比较麻烦了,特别是涉及的lob字段多的时候。
    参考:http://www.orafaq.com/forum/t/48485/0/
    3、改变插入OracleParameter的时机。
    这个试了一次,没成功,回头再验证一下。
    参考:http://stackoverflow.com/questions/3557995/issues-calling-stored-procedure-from-c-sharp-with-large-clob