Соединение 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 знаю, если это правильный способ сделать это или какой-то другой гладкий обходной путь уже доступен. Но это сработало.