Соединение Oracle с использованием ODP.NET с корпоративной библиотекой DAAB

Наше приложение использует корпоративную библиотеку DAAB для поддержки баз данных Oracle и SQL.

Одна из хранимых процедур предназначена для загрузки изображения в таблицу. Это's поле BLOB и для параметра установлено значение DbType.Binary.

Эта функциональность работает без проблем для SQL, но когда дело доходит до Oracle, я сталкиваюсь с проблемой ограничения размера параметра 32K.

Как предложено в SO, я переместил код в ODP.NET, но все еще сталкиваюсь с той же проблемой.

Моя настройка файла App.config:



    


    
        
    


    

В своем коде приложения я использую корпоративную библиотеку для доступа к БД

 Database db = DatabaseFactory.CreateDatabase(); 
 DbCommand cmd = db.GetStoredProcCommand(spName);
 cmd.CommandType = CommandType.StoredProcedure;
 db.AddInParameter(cmd, "DOCIMAGE", DbType.Binary, GetByteArrayFromFile(filePath));
 db.AddOutParameter(cmd, "return_value", DbType.Int32, 128);
 int row = db.ExecuteNonQuery(cmd);

В моем проекте есть ссылки на следующие сборки:

Теперь, когда я запускаю приложение, предполагается, что Ent Lib DAAP использует Oracle.DataAccess.Client, но он все еще подключен к oracle db через System.Data.OracleClient. Таким образом, ограничение 32K все еще там.

Почему он не использует Oracle Data Provider, как я четко упомянул в App.config?

В одном посте упоминается использование следующего фрагмента в качестве обходного пути,

DbProviderFactory providerFactory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client");
Database db = GenericDatabase(connectionString, providerFactory); 

Этот, кажется, работает.

Но инстанцированная База данных имеет GenericDatabase вместо OracleDatabase, может быть, чтоПочему даже этот обходной путь все еще вызывает исключение, когда размер файла превышает 32 КБ.

Как использовать ODP.NET с Enterprise Library для ограничения размера 32 КБ?

ПОСТАНОВИЛИ:

Я последовал заhridya прохождение. Как он упомянул, были ошибки XML-комментария, которые можно отключить(Смотри сюда), Также было несколько конфликтов пространства имен, которые были разрешены путем выбора Oracle.DataAccess.Client. После этого он успешно скомпилирован.

Вот мой фрагмент кода из примера приложения, которое я сделал для проверки изменений. (Пример решения теперь ссылается на новые скомпилированные Data и Common dll.)

Database db = DatabaseFactory.CreateDatabase();
            DbCommand cmd = db.GetStoredProcCommand(sqlCode);
            cmd.CommandType = CommandType.StoredProcedure;
            db.AddInParameter(cmd, "DOCIMAGE", DbType.Binary, GetByteArrayFromFile(filePath));
            db.AddOutParameter(cmd, "return_value", DbType.Int32, 128);
            int rowID = db.ExecuteNonQuery(cmd);

Я проверил объект команды, теперь он имеет тип Oracle.DataAccess.Client.OracleCommand, тогда как ранее это был System.Data.OracleClient.OracleCommand.

Помните, поскольку я уже изменил DAAB для использования ODP.NET, я неНеобходимо явно указать поставщика в файле конфигурации с помощью тега providerMappings.

Но я все равно получаю ту же ошибку, когда размер файла превышает 32 КБ. Шаг за строкой кода показывает, что проблема связана с DbType.Binary. Это неизменить на правильный OracleDbType.

Чтобы это работало, я добавил еще одно исправление кода в Enterprise Lib 'Данные проекта.

Файл:\ Oracle \ OracleDatabase.cs

Метод:AddParameter

Оригинальный код:

public override void AddParameter(DbCommand command, string name, DbType dbType, int size,
        ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn,
        DataRowVersion sourceVersion, object value)
    {
        if (DbType.Guid.Equals(dbType))
        {
            object convertedValue = ConvertGuidToByteArray(value);

            AddParameter((OracleCommand)command, name, OracleDbType.Raw, 16, direction, nullable, precision,
                scale, sourceColumn, sourceVersion, convertedValue);

            RegisterParameterType(command, name, dbType);
        }
        else
        {
            base.AddParameter(command, name, dbType, size, direction, nullable, precision, scale,
                sourceColumn, sourceVersion, value);
        }
    }

Добавлено условие для DbType.Binary

Модифицированный код:

public override void AddParameter(DbCommand command, string name, DbType dbType, int size,
        ParameterDirection direction, bool nullable, byte precision, byte scale, string sourceColumn,
        DataRowVersion sourceVersion, object value)
    {
        if (DbType.Guid.Equals(dbType))
        {
            object convertedValue = ConvertGuidToByteArray(value);

            AddParameter((OracleCommand)command, name, OracleDbType.Raw, 16, direction, nullable, precision,
                scale, sourceColumn, sourceVersion, convertedValue);

            RegisterParameterType(command, name, dbType);
        }
        else if(DbType.Binary.Equals(dbType))
        {
            AddParameter((OracleCommand)command, name, OracleDbType.Blob, size, direction, nullable, precision,
                scale, sourceColumn, sourceVersion, value);

        }
        else
        {
            base.AddParameter(command, name, dbType, size, direction, nullable, precision, scale,
                sourceColumn, sourceVersion, value);
        }
    }

Я неt знаю, если это правильный способ сделать это или какой-то другой гладкий обходной путь уже доступен. Но это сработало.

Ответы на вопрос(2)

Ваш ответ на вопрос