简单搞一下 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;
}
}
{
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);
mDesc.Value = Data.Tools.OracleLobHandler.ConvertToLob(da, goods.Desc.Description);
一花一世界 一叶一菩提