且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用ODP .NET使用C#从Oracle数据库读取BLOB

更新时间:2023-02-14 19:13:30

前段时间有类似的问题,我使用以下解决方案:

Some time ago a had similar problem and I use this solution:

创建PL/SQL函数:

Create a PL/SQL Function:

FUNCTION GetBlob(pCOMPANY_EMPID_FOLIO IN NUMBER) RETURN SYS_REFCURSOR IS
    res SYS_REFCURSOR;
BEGIN
    OPEN res FOR 
    SELECT XML_AND_PDF_ZIP  
    FROM CF2 
    WHERE COMPANY_EMPID_FOLIO = pCOMPANY_EMPID_FOLIO;
    RETURN res; 
END GetBlob; 

并这样称呼它:

OracleCommand cmd = new OracleCommand("BEGIN res := GetBlob(:primaryKey); END;"), ora.Connection);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("res", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
cmd.Parameters.Add("primaryKey", OracleDbType.Int32, ParameterDirection.Input).Value = sFolio;
cmd.InitialLOBFetchSize = 16384;
using (OracleDataReader dr = cmd.ExecuteReader() ) {
   dr.Read();
   OracleBlob blob = dr.GetOracleBlob(0);
   MemoryStream ms = new MemoryStream(blob.Value);
   dr.Close();
}

注意,我的应用程序使用ODP.NET非托管驱动程序.也许您的问题是由于托管驱动程序中的错误所致.

Note, my application uses the ODP.NET Unmanaged Driver. Perhaps your issue is due to a bug in the Managed Driver.