Вопрос

У меня есть тип, объявленный в базе данных Oracle:

CREATE OR REPLACE TYPE t_project_code_changes AS TABLE OF obj_project_code_change; 

Я сопоставляю этот тип в C# как SO SO

[OracleCustomTypeMapping("DEV_SCHEMA.OBJ_PROJECT_CODE_CHANGE")]
class ProjectCodeChangeFactory : TypeFactoryTemplate<ProjectCodeChangeDTO>
{
    //code
}

Приведенный выше код работает без ошибки, однако, если я удалю имя схемы «dev_schema» из атрибута, он не удается:

[OracleCustomTypeMapping("OBJ_PROJECT_CODE_CHANGE")]

Генерирует следующую ошибку:

Неправленное исключение: System.InvalidoPerationException: пользовательское отображение типа для «ProjectCodechangeDto» не указано или действует.
at oracle.dataaccess.types.oracleudt.getudtname (String CustomtyPename, String DataSource)

В какой -то момент я захочу отправить код мимо «dev_schema», но это приведет к сбою кода.

Имя схемы происходит от строки подключения User Id:

"Data Source=DBNAME;User id=DEV_SCHEMA;Password=pwd;Pooling=False;" 

Есть ли что -нибудь, что я могу сделать в Oracle of C# стороне, чтобы помочь мне с этим. Т.е. как -то:

  1. Передайте имя схемы в качестве параметра атрибута
  2. Определите тип Oracle так, чтобы мне не нужно использовать схему

В качестве дополнительной информации, эта проблема представляет себя, когда я использую клиентскую версию ODP.net 11.1.0.7. 11.2 версия DLL отлично работает без имени схемы в атрибуте.

Любая помощь приветствуется.

Это было полезно?

Решение

Если вам не нужно придерживаться OracleCustomTypeMapping Подход атрибута, я думаю, лучшим решением было бы установить отображения пользовательских типов через файл конфигурации.

Другие советы

Я занимался этим в прошлом, используя следующее:

internal static class OracleConfig
{
#if SHIPPING
    internal const string SCHEMA = @"REL.";
#else
    internal const string SCHEMA = @"DEV.";
#endif
}

Тогда вы можете использовать его так:

[OracleCustomTypeMapping(OracleConfig.SCHEMA + "OBJ_PROJECT_CODE_CHANGE")]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top