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

在.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的对象没有二进制流大小的限制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: