AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.01.2008, 13:59   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Максимальная длина символьного поля CCADOField
Мне надо через ADO подключиться к внешней базе данных Oracle (данные не связаны с Axapta) и прочитать содержимое полей. Выполняю такой код

X++:
static server void test_ADO()
{
    CCADOConnection adoConnection;
    CCADORecordSet  adoRecordSet;
    CCADOCommand    adoCommand;
    CCADOFields     adoFields;
    CCADOField      adoField;
    ;

    adoConnection = new CCADOConnection();
    adoConnection.open("Provider=OraOLEDB.oracle;Data Source=ХХХ;User Id=YYY;Password=ZZZ;");
    adoCommand = new CCADOCommand();
    adoCommand.activeConnection(adoConnection);
    adoCommand.commandType(1);

    adoCommand.commandText("SELECT MyField FROM MyTable WHERE rownum <= 1");
    adoRecordSet = adoCommand.execute();
    adoFields = adoRecordSet.fields();
    adoField = adoFields.itemIdx(0);
    while (! adoRecordSet.EOF())
    {
        print adoField.name(),"=",adoField.value(), " ", strLen(adoField.value());

        adoRecordSet.moveNext();
    }
    pause;

}
Проблема в том, что длина символьных полей обрезается до 100 (ста) символов. Все, что превышает 100 символов просто отбрасывается.

Как можно получить полное содержимое символьных полей без ограничения по длине? Т.е. длина может быть и более 1000 символов (мемо-поля)

AXPATA 2.5 SP3

Использован драйвер "Oracle Provider for OLE DB 9.2.4.0" из пакета "Oracle9i Release 2 Provider for OLE DB Version 9.2.0.4.0 (including ODAC) 32-bit"
Старый 09.01.2008, 19:14   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
На Axapta 3.0, SP4, OraOLEDB.dll версии 9.2.0.1, MDAC версии 2.53 - не воспроизводится.
Нормально читает всё содержимое из полей VARCHAR2(4000) и LONG.
Из LONG спокойно читается строка длиной 25 тыс. символов.
Старый 10.01.2008, 12:49   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Спасибо. Натолкнул на мысль проверить типы. Проблема оказалось только с типом LONG. Тип VarChar2 читается без проблем и ограничений. Хотя все-равно не понятно почему...
Старый 10.01.2008, 14:50   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
НА ЗАМЕТКУ: прочитал здесь http://citforum.urc.ac.ru/database/cnit/6.shtml следующее (речь о Перле):

Цитата:
$ora_long Обычно Oraperl спрашивает базу данных о длине каждого поля и соответствующим образом распределяет буферное пространство. Это невозможно для полей типа LONG и LONGRAW. Распределение пространства в предположении максимально возможной длины (65535 bytes) привело бы к излишним тратам памяти. Поэтому когда &ora_open() определяет, что поле имеет тип LONG, память распределяется согласно значению переменной $ora_long. При инициализации она принимает значение 80 (для совместимости с продуктами Oracle), но в программе ее можно устанавливать произвольным образом.
может, нечто похожее?
Старый 10.01.2008, 16:48   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Владимир, а что если из Excel такой VBA-шный "джобик" запустить, чтобы понять, в Аксапте ли дело?:
Код:
Sub test_ADO_onVBA()

    Dim adoConnection As Object
    Dim adoRecordSet As Object
    Dim adoCommand  As Object
    Dim adoFields As Object
    Dim adoField As Object

    Set adoConnection = CreateObject("ADODB.Connection")
    adoConnection.Open "Provider=OraOLEDB.oracle;Data Source=ХХХ;User Id=YYY;Password=ZZZ;"
    
    Set adoCommand = CreateObject("ADODB.Command")
    adoCommand.activeConnection = adoConnection
    adoCommand.CommandType = 1

    adoCommand.CommandText = "SELECT MyField FROM MyTable WHERE rownum <= 1"
    Set adoRecordSet = adoCommand.Execute
    Set adoFields = adoRecordSet.fields
    Set adoField = adoFields.Item(0)

    While Not adoRecordSet.EOF
        Debug.Print adoField.Name, "=", adoField.Value, " ", Len(adoField.Value)
        adoRecordSet.moveNext
    Wend
    
End Sub
У меня по-прежнему всё выполняется как надо

P.S. Ну и заодно попробовать "Provider=MSDAORA" , чтобы убедиться, в провайдере ли дело.
Старый 11.01.2008, 11:32   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Проверил. С Excel та же проблема. Тип Long обрезается до 100 символов, а VarChar2 - без ограничений

MDAC_Checker показыват что установлен MDAC 2.8 SP2

А вот драйвер от Microsoft берет нормально. Ничего не обрезает. Т.е. однозначно проблема с драйвером.

Что ж, по крайней мере, выяснили причину. Спасибо.

Хотя оракловая версия дравера и постарше 9.2.0.4, но работает хуже

Последний раз редактировалось Владимир Максимов; 11.01.2008 в 11:50.
Теги
документация, ax2.5, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
HRM,склонение ФИО и все все все OmenSore DAX: Функционал 22 09.02.2009 17:08
Максимальная длина типа String в DAX 4.0 alex55 DAX: Программирование 31 29.01.2009 15:33
Denis Fedotenko: Новые поля в складских проводках Blog bot DAX: База знаний и проекты 10 24.05.2007 11:57
Длина поля ax_f DAX: Программирование 5 24.09.2004 12:17
Получить значение поля таблицы по номеру (Id) поля Anais DAX: Программирование 2 15.04.2004 13:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:19.