在.net中给Oracle上传文件超过一定大小出错的问题

本文介绍了一种解决Oracle数据库中Blob类型大文件上传的方法。通过使用OracleLob对象及临时Blob变量,可以避免因文件过大导致的参数错误,适用于各种大小的二进制文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在.net中,上传文件可以直接实例化一个OracleParameter参数,这个参数的类型为 OracleType.Blob类型,可以直接将二进制文件的byte[]类型的数组直接赋值给这个参数的Value值。但是在实际使用中,出了一点问题,当文件的大小大于1M(好像是的),执行存储过程会报参数错误。说明了这样给参数赋值是有局限的,参考了msdn的文档,发现给Oracle参数赋二进制的值的确不能这样赋值,现在将msdn的例子贴出来,里面加了我的注释说明
//实例化数据库链接,并打开
OracleConnection conn = new OracleConnection("server=MyServer; integrated security=yes;");
conn.Open();
//启动一个事务
OracleTransaction tx = conn.BeginTransaction();
构造一个sql命令对象,并指定这个命令的事务对象
OracleCommand cmd 
= conn.CreateCommand();
cmd.Transaction 
= tx;
//这里是关键,他定义了一个命令对象的t-sql语句,通过dmbs_lob来创建一个零时对象,这个对象的类型为blob,并存放在变量xx中,然后将xx的值付给外传参数tmpblob
cmd.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
//构造外传参数对象,并加入到命令对象的参数集合中
cmd.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob)).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
//构造OracleLob对象,他的值为tmpblob外传参数的值
OracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
//指定tempLob的访问模式,并开始操作二进制数据
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
//将二进制流byte数组集合写入到tmpLob里
tempLob.Write(tempbuff,0,tempbuff.Length);
tempLob.EndBatch();
cmd.Parameters.Clear();
cmd.CommandText 
= "myTable.myProc";
cmd.CommandType 
= CommandType.StoredProcedure;  
//创建存储过程的Blob参数,并指定Blob参数的值为tempLob(表示服务器上大型对象二进制数据类型),并将Blob参数加入到command对象的参数集合里
cmd.Parameters.Add(new OracleParameter("ImportDoc", OracleType.Blob)).Value = tempLob;
cmd.ExecuteNonQuery();
tx.Commit();
像这样操作Oracle的blob的对象没有二进制流大小的限制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值