Чтение BLOB из базы данных Oracle с C# с использованием ODP. NET - PullRequest
0 голосов
/ 15 марта 2020

У меня проблемы с получением BLOB-объекта из Oracle БД, я делаю простой C# консольный проект, пробуя примеры упражнений от Google, пытаясь выяснить, в чем проблема. Я делаю заявление выбора для получения данных. Эта программа работает, но если я включаю столбец типа BLOB-объекта («XML_AND_PDF_ZIP»), который является столбцом, который я хочу получить из таблицы, я получаю сообщение об ошибке ORA-03135: Советы при потере соединения при выполнении метода Read () объекта OracleDataReader.

Я использую Oracle .ManagedDataAccess в качестве моего поставщика ODP. NET. * База данных Oracle 10g 10.2 64bit.
Я что-то упустил, прежде чем метод 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);
        }
    }

1 Ответ

0 голосов
/ 15 марта 2020

Некоторое время у go a была похожая проблема, и я использую это решение:

Создайте 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 Неуправляемый драйвер. Возможно, ваша проблема связана с ошибкой в ​​управляемом драйвере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...