Dli K Ответов: 1

Как добавить отсутствующий первичный ключ в datatable (oracle db)


У нас есть две таблицы (формула и элемент), обе таблицы содержат первичный ключ (формула = Formula_Id и элемент = item_code).
присоединился к таблице, чтобы получить результат от обеих таблиц.
Мы используем отключенный подход для извлечения данных из oracle в Dotnet datable.
Код прекрасно работает с базой данных sqlserver. он добавляет столбец formula_id в качестве первичного ключа.
(чего мы и хотим)


Когда мы выполняем его против oracle. Первичный ключ объекта DataTable длина становится равной нулю, означает отсутствие первичных ключевых столбцов в объект DataTable.
Логика кода одинакова, и оператор select также одинаков, нет никакой разницы, но для sql server это добавление первичного ключа.


OracleDataAdapter добавляет столбцы первичного ключа, если в инструкции select используется только одна таблица.
Если мы присоединяемся к таблице или добавляем запрос внутри запроса, то он не добавляет никакого парного ключевого столбца в datatable.

Что я уже пробовал:

Если я задам столбцу PRIMARY_IND значение по умолчанию “0”, то он добавит столбец FORMULA_ID в качестве первичного ключа в таблицу данных.
SELECT  FORMULA_ID,  FORMULA_CODE, VERSION,  DESCRIPTION,  UOM_CODE,  YIELD, YIELD_PCT, DOC_ID, TYPE_IND, PROCESS_YIELD,  OWNER_CODE,  OWNER_SECURITY,  GROUP_CODE,  GROUP_SECURITY ,  ROLE_SECURITY,  STATUS_IND, FORMULATOR_CODE, YIELDCALC_IND,  CLASS,  LOGICAL_DELETE, ADJUST_PARAM,ROLLUP_ID,CALC_MODE,  ITEM_CODE, 0 AS PRIMARY_IND  FROM FORMULA F WHERE FORMULA_CODE = [%1] AND VERSION=[%2]'

Если я задам выражение, как показано ниже, то оно добавит столбец ITEM_CODE в качестве первичного ключа в таблицу данных.
SELECT  FORMULA_ID,  FORMULA_CODE, VERSION,  DESCRIPTION,  UOM_CODE,  YIELD, YIELD_PCT, DOC_ID, TYPE_IND, PROCESS_YIELD,  OWNER_CODE,  OWNER_SECURITY,  GROUP_CODE,  GROUP_SECURITY ,  ROLE_SECURITY,  STATUS_IND, FORMULATOR_CODE, YIELDCALC_IND,  CLASS,  LOGICAL_DELETE, ADJUST_PARAM,ROLLUP_ID,CALC_MODE,(SELECT COUNT(*) FROM ITEM I WHERE I.ITEM_CODE = F.ITEM_CODE AND I.FORMULA_ID = F.FORMULA_ID) AS PRIMARY_IND ITEM_CODE FROM FORMULA F WHERE FORMULA_CODE = [%1] AND VERSION=[%2]

оба запроса работают нормально и добавляют столбцы formula_id в качестве первичного ключа в datatable, если мы выполняем их против sql-сервера.

Это не работает для oracle.

1 Ответов

Рейтинг:
2

Member 13494490

Попробуйте использовать материализованные представления на ваших кольцах.
или используйте item_code в качестве fk в таблице формул.