DataMapping. Поле с коллекцией видится как XML

Обсуждение возникших проблем, предложений и ошибок ODAC компонентов
Закрыто
Eugeni
Сообщения: 7
Зарегистрирован: Вт 22 апр 2014 07:26

DataMapping. Поле с коллекцией видится как XML

Сообщение Eugeni » Пт 19 сен 2014 10:32

Добрый день.
В OraSession задал преобразование XML в String(2000).
В одном из запросов в курсоре есть поле с коллекцией.
На этом запросе DataMapping мне сообщает, что неправильное преобразование поля из XML в String(2000). А в запросе нет поля XML.
Ошибка при любом значении ObjectView.
Убрал преобразование, запрос отработал.
Обнаружил, что тип у поля с коллекцией определяется как oraXML = 121.
Как вылечить?
ODAC 9.3.10

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: DataMapping. Поле с коллекцией видится как XML

Сообщение Alexp » Пт 19 сен 2014 14:09

Добрый день,

Пожалуйста приведите скрипт для создания таблицы, и запрос на котором возникает описанная ситуация.

Eugeni
Сообщения: 7
Зарегистрирован: Вт 22 апр 2014 07:26

Re: DataMapping. Поле с коллекцией видится как XML

Сообщение Eugeni » Пн 22 сен 2014 08:05

Добрый день.
Небольшая поправка... Выборка идет из таблицы с Nested Table.

Вот небольшой пример.

Код: Выделить всё

CREATE TYPE T_TYPE_CHAIR IS TABLE OF VARCHAR2(100);
/

CREATE TABLE TBL_CHAIRS (ID NUMBER, CHAIR_NAME  UTL.T_TYPE_CHAIR)
   NESTED TABLE CHAIR_NAME STORE AS TBL_NESTED_CHAIRS;
/

INSERT INTO TBL_CHAIRS
VALUES (1, T_TYPE_CHAIR('стул','табуретка'));

INSERT INTO TBL_CHAIRS
 VALUES (2, T_TYPE_CHAIR('кресло','пуфик','диван'));

COMMIT;
Пакетик

Код: Выделить всё

create or replace package PKG_CHAIR is

  PROCEDURE CHAIR_SEL(OUT_CURSOR OUT SYS_REFCURSOR);

end PKG_CHAIR;
/
create or replace package body PKG_CHAIR is

PROCEDURE CHAIR_SEL(OUT_CURSOR OUT SYS_REFCURSOR)
AS
BEGIN
  OPEN OUT_CURSOR FOR
    SELECT *
      FROM Tbl_Chairs; 
END CHAIR_SEL;

end PKG_CHAIR;
Открываем пустой проект Delphi, в моем случае (XE2).
Бросаем OraSession и OraQuery.
В OraQuery пишем запрос

Код: Выделить всё

begin
  UTL.PKG_CHAIR.CHAIR_SEL(:OUT_CURSOR);
end;
Подключаем DBGrid к OraQuery.
Запускаем.
Запрос отрабатывает, во 2-ой колонке светится "(DATASET)". Всё правильно.
Теперь, добавим в OraSession преобразование XML в String(2000).
Запускаем.
Ошибка "Project Project1.exe raised exception class EUnsupportedDataTypeMapping with message 'Unsupported data type
mapping: "XML" to "String(2000)"'."


Исправил я эту ошибку, но это жесткий хак...
Модуль OraClasses, function TOCIRecordSet.GetFieldDesc8

Код: Выделить всё

      ....
      Field.SubDataType := FCommand.GetInternalType8(OraType, NationalCharset);
    {$IFNDEF LITE}
      Field.DBType := TOraConverterManager.GetDBType(OraType, NationalCharset);
     // Field.DBType - становиться oraXML, хотя Field.ObjectType.DataType = dtTable(=18)
     // Если в поляне XML то Field.ObjectType.DataType = dtXML(=37)
     // <-------- Добавил - Начало
      if OraType = SQLT_NTY then
        if Field.ObjectType<>nil then
          if (Field.ObjectType.DataType = dtTable) then
              Field.DBType := 29;
     // <-------- Добавил - Окончание
    ...
Запускаем. Работает...

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: DataMapping. Поле с коллекцией видится как XML

Сообщение Alexp » Пн 22 сен 2014 09:21

Спасибо за пример, ситуацию воспроизвели и будем исследовать. Как только появятся результаты мы сообщим Вам.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: DataMapping. Поле с коллекцией видится как XML

Сообщение Alexp » Пн 22 сен 2014 11:12

Проблема исправлена, это исправление войдет в ближайшую версию.

Закрыто