简单搞一下 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,它必须包含在事务中。
创建一个存储过程,担任系统中的专职角色,负责将用户的提交的大文本数据与大字段存储前进行一次类型的“转化”(不知道可以这样说不!)
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);
必须在获取临时 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);
相关文章推荐
- System.Data.OracleClient调用带blob等大字段类型参数的存储过程
- System.Data.OracleClient调用带blob等大字段类型参数的存储过程
- 关于ORACLE提示:"System.Data.OracleClient.OracleException: ORA-06550: 第 1 行, 第 7 列: \nPLS-00306: 调用 'xxxxxx' 时参数个数或类型错误\nORA-06550: 第 1 行, 第 7 列: \nPL/SQL: Statement ignored\n\r\n 的错误
- :"System.Data.OracleClient.OracleException: ORA-06550: 第 1 行, 第 7 列: \nPLS-00306: 调用 'MEETING_NOTICE_CREATE' 时参数个数或类型错误
- Oracle复合类型参数的存储过程以及JDBC调用
- C#调用Oracle的存储过程,其参数为数组类型
- C#调用Oracle的存储过程,其参数为数组类型”中的­Package
- C#调用Oracle的存储过程,其参数为数组类型
- Java调用Oracle集合类型输出参数的存储过程
- Java调用Oracle集合类型输出参数的存储过程
- Oracle复合类型参数的存储过程以及JDBC调用
- Oracle复合类型参数的存储过程以及JDBC调用
- clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】
- Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段类型中存储的xml字符串
- Java调用Oracle集合类型输出参数的存储过程
- asp.net 最简单的处理System.Data.OracleClient requires Oracle client software version 8.1.7 or greater
- System.Data”中不存在类型或命名空间名称“OracleClient
- Java 存储和读取 oracle CLOB 类型字段(转)
- DATASNAP中间件调用带OUTPUT参数的存储过程
- jdbc中调用oracle 返回游标类型的存储过程