我想将一些图片文件存储在oracle数据库中,想通过一个标准的存储过程来实现,该怎么写?存储过程的入参应该采用blob还是long raw类型?通过ado.net(C#语言)调用时,OracleCommand参数如何传值?请大虾们帮帮我。如有代码例子更感激不尽。

解决方案 »

  1.   

    存储过程如下:  
    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:
     
    请指教!!