繁体   English   中英

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

[英]Reading a BLOB from Oracle Database with C# using ODP .NET

我在从 Oracle DB 获取 Blob 时遇到问题,我正在做一个简单的 C# 控制台项目,尝试从 google 尝试示例练习,试图找出问题所在。 我正在做一个选择语句来获取数据。 该程序有效,但如果我包含 blob 类型列(“XML_AND_PDF_ZIP”),这是我想要从表中获取的列,我会在 OracleDataReader 对象的 Read() 方法执行时收到错误 ORA-03135:连接丢失联系提示。

我使用 Oracle.ManagedDataAccess 作为我的 ODP .NET 提供程序。 Oracle 数据库版本为 10g 10.2 64 位。
在 ExecuteReader() 方法命中之前,我是否遗漏了什么?

private static string GetConnectionString(string _connectionID)
        {
            return ConfigurationManager.ConnectionStrings[_connectionID].ConnectionString;
        }

    public static List<CF2> GetOraBlob(string sFolio)
    {
        try
        {
            List<CF2> result = new List<CF2>();
            using (OracleConnection conn = new OracleConnection(GetConnectionString(connectionID)))
            {
                using (OracleCommand cmd = conn.CreateCommand())
                {

                    cmd.CommandText = "SELECT COMPANY_EMPID_FOLIO, XML_AND_PDF_ZIP  FROM CF2 WHERE COMPANY_EMPID_FOLIO = :pCOMPANY_EMPID_FOLIO FOR UPDATE"; //XML_AND_PDF_ZIP is the Blob Column
                    cmd.Parameters.Add("pCOMPANY_EMPID_FOLIO", OracleDbType.Varchar2, 15).Value = sFolio;
                    cmd.CommandType = CommandType.Text;
                    cmd.BindByName = true;
                    conn.Open();
                    using (OracleDataReader reader = cmd.ExecuteReader())
                    {
                            while (reader.Read()) //Get ORA-03135 Error If the Blob Column is in the Select Statement
                            {

                                CF2 data = new CF2();
                                data.Folio = reader["COMPANY_EMPID_FOLIO"].ToString();
                                data.OraBlob = Convert.ToByte(reader["XML_AND_PDF_ZIP"]);
                                result.Add(data);

                            }

                    }
                }
            }
            return result;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }

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

创建一个 PL/SQL 函数:

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 非托管驱动程序。 也许您的问题是由于托管驱动程序中的错误造成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM