在.net中给Oracle上传文件超过一定大小出错的问题
2008-03-29 00:36
471 查看
在.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的对象没有二进制流大小的限制
//实例化数据库链接,并打开
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的对象没有二进制流大小的限制
相关文章推荐
- Oracle Lesson 7 子程序和程序包
- oracle 监听程序无法启动解决方法。
- oracle里的dual表
- 在ORACLE大数据量下的分页解决方法。
- 一段Jdbc连Oracle的程序,并实现数据查询.
- 使用流上传WORD和下载WORD(oracle)
- Oracle 服务进程-简单介绍
- Oracle客户端查询中文出现乱码的问题
- ORACLE日期类型的计算
- Oracle DATA数据类型中计算时间差
- Oracle JDeveloper 10g
- Oracle数据导入导出imp/exp命令
- oracle在linux自启动和停止脚本
- Oracle10g "无监听程序"处理方法
- 错误"存取器不是参数存取器"的解决方法
- java连接oracle DB
- Oracle-关于DBW0、Server Process与数据文件的两个常见误解
- [转] 在linux AS3.0上安装ORACLE9.2.04
- spring+hibernate2.0+oracle9i实现clob字段的插入和读出
- J2EE-PL/SQL工具连接Oracle数据库的方法