简单搞一下 System.Data.OracleClient调用带blob、clob等大字段类型参数的存储过程!

System.Data.OracleClient在插入大字段类型的时候有32K大小限制,据网络收集的一些方法,整理了一下如下(微软企业库示例):

必须在获取临时 LOB 之前开始事务。否则,OracleDataReader 将不能获取后面的数据。

还可以通过调用 DBMS_LOB.CREATETEMPORARY 系统存储过程并绑定 LOB 输出参数打开 Oracle 中的临时 LOB。在客户端,临时 LOB 的行为很像基于表的 LOB。例如,要更新临时 LOB,它必须包含在事务中。

DBMS_LOB.CREATETEMPORARY(
      lob_loc   IN OUT NOCOPY {BLOB | CLOB CHARACTER SET ANY_CS}
    , cache     IN BOOLEAN
    , duration  IN PLS_INTEGER := DBMS_LOB.SESSION
)

创建一个存储过程,担任系统中的专职角色,负责将用户的提交的大文本数据与大字段存储前进行一次类型的“转化”(不知道可以这样说不!)

create or replace procedure proc_create_tmp_clob(p_tmp_clob out clob) 
is
begin  
dbms_lob.createtemporary(p_tmp_clob, false, 0);
end proc_create_tmp_clob;

这样就能很好的完成,程序段向oracle数据库端传输大文本、或者html文本片段数据了!

简单举个例吧-(新增商品详细信息,商品详细信息为html片段)

先创建一个处理大字段数据的共用方法,如下操作即可!

publicstatic OracleLob ToByte(object tmpLob, string content)
{
try
{
OracleLob tempLob
= (OracleLob)tmpLob;

System.Text.Encoding enc
= System.Text.Encoding.Unicode;

Byte[] b
= enc.GetBytes(content);

tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(b,
0, b.Length);
tempLob.EndBatch();

return tempLob;
}
catch (Exception ex)
{
throw ex;
}
}
 

publicstatic OracleLob ConvertToLob(DataAccess da, string content)
{
try
{

if(da.Oc.State == ConnectionState.Closed)
{
da.Oc.Open();
}
OracleParameter mTempLob
=new OracleParameter("p_tmp_clob", OracleType.Clob);
mTempLob.Direction
= ParameterDirection.Output;


Tools.OracleHelper.ExecuteNonQuery(da.Oc,
CommandType.StoredProcedure,
"proc_create_tmp_clob",
mTempLob);


if (content ==null|| content =="")
return (OracleLob)mTempLob.Value;
return ToByte(mTempLob.Value, content);
}
catch(Exception ex)
{
throw ex;
}
}
}
OracleParameter mDesc = new OracleParameter("p_goods_desc", OracleType.Clob);
mDesc.Value
= Data.Tools.OracleLobHandler.ConvertToLob(da, goods.Desc.Description);        
posted @ 2011-05-26 22:20  darjuan  阅读(658)  评论(0编辑  收藏  举报