您的位置:首页 > 数据库 > Oracle

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

2011-05-26 22:20 871 查看
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);        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐