Asp.net 向Oracle存储Clob字段时,小于 4000个字符时(OracleType.Varchar最大长度)处理正常。但当大于时,就会出错。
解决方法如下(本文用的是微软企业库,其他的可以根据实际改):
测试表
create or replace table Test
(
id varchar2(20),
title varchar2(50),
content clob
)
Sql Parameter形式
Sql 语句形如:
string sqlStr="insert into test(id,title,content) values(:Id,:Title,:Content)"
处理方法:
OracleParameter Content = new OracleParameter("Content", OracleType.Clob);
Content.Direction = ParameterDirection.Input;
Content.Value = model.Content;
dbCommand.Parameters.Add(Content);
我们可以写一个类处理,代码如下:
public class OracleLobUtils
{
/// <summary>
///存储Blob时,把内容存入OracleParameter,如果内容为空,则使用Varchar2。默认方向Input.
/// </summary>
/// <param name="orakey">字段</param>
/// <param name="value">值</param>
/// <returns></returns>
public static IDataParameter CreateBlobParameter(string orakey, byte[] value)
{
OracleParameter param = null;
param = new OracleParameter(orakey, OracleType.Blob);
if (value != null && value.Length > 0)
{
param.Value = value;
}
else
{
param.Value = DBNull.Value;
}
param.Direction = ParameterDirection.Input;
return param;
}
/// <summary>
///存储Clob时,把内容存入OracleParameter,如果内容为空,则使用Varchar2。默认方向Input.
/// </summary>
/// <param name="orakey">字段</param>
/// <param name="value">值</param>
/// <returns></returns>
public static OracleParameter CreateClobParameter(string orakey, string value)
{
OracleParameter param = null;
if (string.IsNullOrEmpty(value))
{
param = new OracleParameter(orakey, OracleType.VarChar);
param.Value = string.Empty;
}
else
{
param = new OracleParameter(orakey, OracleType.Clob);
param.Value = value;
}
param.Direction = ParameterDirection.Input;
return param;
}
}