ADO.net调用Oracle存储过程实现图片文件的数据库存入和读取? 我想将一些图片文件存储在oracle数据库中,想通过一个标准的存储过程来实现,该怎么写?存储过程的入参应该采用blob还是long raw类型?通过ado.net(C#语言)调用时,OracleCommand参数如何传值?请大虾们帮帮我。如有代码例子更感激不尽。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 存储过程如下: procedure InsertBlob(mFileData1 in blob) as lobLoc blob; NewFileDataId T_WORKFLOW_FILEDATA.FileDataId%type; begin insert into T_WORKFLOW_FILEDATA(FileData1,FileData2) Values(empty_blob(),empty_blob()); select SEQ_ARCHIVEFILEDATAID.currval into NewFileDataId from dual; update T_WORKFLOW_FILEDATA set FileData1=mFileData1 where FileDataId=NewFileDataId; commit; end InsertBlob;C#代码如下: FileStream fs = new FileStream("c:\\样品.jpg", FileMode.Open); byte[] byteBlob = new byte[fs.Length]; fs.Read(byteBlob, 0, byteBlob.Length); fs.Close(); OracleParameter parm1 = new OracleParameter(); parm1.ParameterName = "mFileData1"; parm1.OracleType = OracleType.Blob; parm1.Direction = ParameterDirection.Input; parm1.Value = byteBlob; parm1.Size = byteBlob.Length; _oraHelper.ExecuteNonQuery(_connString,CommandType.StoredProcedure,"PKG_TEST.InsertBlob",parm1);执行时报错如下:类型 System.Byte[] 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentException: 类型 System.Byte[] 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。源错误: 行 254: tempLob = (OracleLob)(cmd.Parameters[0].Value);行 255: tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);行 256: tempLob.Write((byte [])(p.Value), 0, System.Runtime.InteropServices.Marshal.SizeOf(p.Value));行 257: tempLob.EndBatch();行 258: 请指教!! oracle 9i 为什么数据库字符集不能设置为AL16UTF16 win7安装oracle9i的问题 关于触发器的一个问题 ORA-01219:数据库未打开。。。如何解决? 能否用select语句获得日期类型字段的年份?不显示月,日 关于数据导入oracle表的问题 sql语句问题 大家都是通过安装oracle客户端然后建立数据库连接(database link)连接来访问远程的ora server方式进行开发的嘛? 想查找某个字段值的第一个字母为A的记录,如何写SQL语句呢?谢谢 ORACLE查询卡死的问题 奇怪的SQL??? [请教]“无法在查询中执行Dml操作”
procedure InsertBlob(mFileData1 in blob)
as
lobLoc blob;
NewFileDataId T_WORKFLOW_FILEDATA.FileDataId%type;
begin
insert into T_WORKFLOW_FILEDATA(FileData1,FileData2) Values(empty_blob(),empty_blob());
select SEQ_ARCHIVEFILEDATAID.currval into NewFileDataId from dual; update T_WORKFLOW_FILEDATA set FileData1=mFileData1 where FileDataId=NewFileDataId;
commit; end InsertBlob;C#代码如下:
FileStream fs = new FileStream("c:\\样品.jpg", FileMode.Open);
byte[] byteBlob = new byte[fs.Length];
fs.Read(byteBlob, 0, byteBlob.Length);
fs.Close(); OracleParameter parm1 = new OracleParameter();
parm1.ParameterName = "mFileData1";
parm1.OracleType = OracleType.Blob;
parm1.Direction = ParameterDirection.Input;
parm1.Value = byteBlob;
parm1.Size = byteBlob.Length; _oraHelper.ExecuteNonQuery(_connString,CommandType.StoredProcedure,"PKG_TEST.InsertBlob",parm1);执行时报错如下:
类型 System.Byte[] 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentException: 类型 System.Byte[] 不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。源错误:
行 254: tempLob = (OracleLob)(cmd.Parameters[0].Value);
行 255: tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
行 256: tempLob.Write((byte [])(p.Value), 0, System.Runtime.InteropServices.Marshal.SizeOf(p.Value));
行 257: tempLob.EndBatch();
行 258:
请指教!!