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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.08.2014, 17:23   #1  
dax_ is offline
dax_
Участник
 
7 / 10 (1) +
Регистрация: 27.08.2014
AX 2012 R3 доступ к MySQL
Всем доброго времени суток.

Помогите разобраться с подключением АХ 2012 R3 к MySQL. Стандартный способ:
X++:
static public void Main(Args _args)
{
    LoginProperty loginProperty;
    OdbcConnection odbcConnection;
    Statement statement;
    ResultSet resultSet;
    str sql, criteria;
    SqlStatementExecutePermission perm;
    
    str     testconstr,loginPropertyOther;
    ;

    // Set the information on the ODBC.
    loginProperty = new LoginProperty();
    loginProperty.setDSN("test_x64");
       
    loginPropertyOther = strfmt(
                              "Driver={MySQL ODBC 3.51 Driver};"+
                              "Server=192.168.0.1;"+
                              "Port=3306;"+
                              "Database=base;"+
                              "Uid=root;"+
                              "Pwd=123;"+
                              "Option=3");
    
    loginProperty.setOther(loginPropertyOther);
        
    //Create a connection to external database.
    odbcConnection = new OdbcConnection(loginProperty);

    if (odbcConnection)
    {
        sql = "SELECT * FROM table";

        //Assert permission for executing the sql string.
        perm = new SqlStatementExecutePermission(sql);
        perm.assert();

        //Prepare the sql statement.
        statement = new statement();
        statement = odbcConnection.createStatement();
        
        resultSet = new resultSet();
        resultSet = statement.executeQuery(sql);

        //Cause the sql statement to run,
        //then loop through each row in the result.
        while (resultSet.next())
        {
            //It is not possible to get field 3 and then 1.
            //Always get fields in numerical order, such as 1 then 2 the 3 etc.
            print resultSet.getString(1);
            print resultSet.getString(3);
        }

        //Close the connection.
        resultSet.close();
        statement.close();
    }
    else
    {
        error("Failed to log on to the database through ODBC.");
    }
}
возвращает ошибку:
Ошибка Сообщение (17:17:53) Невозможно выбрать запись в ().
База данных SQL обнаружила ошибку.
Информация Сообщение (17:17:53) Описание ошибки SQL: [Microsoft Dynamics AX] Unable to retrieve message for retval -1, ODBC call reason code 100,
SQLSTATE = []
Error message []
Информация Сообщение (17:17:53) Оператор SQL: SELECT * FROM table

В случае, когда я явно не ссылаюсь на DSN, пишет:
Ошибка Сообщение (17:19:54) Операция ODBC прервана из-за ошибки.
Не удается выполнить вход в систему при подключении к базе данных.
Информация Сообщение (17:19:54) [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию
Ошибка Сообщение (17:19:54) Объект "OdbcConnection" не может быть создан


Драйвера ODBC установлены 32 и 64 бита.
Старый 27.08.2014, 19:12   #2  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Подключение к MySQL обсуждалось в этой теме
__________________
AXIOMA
Старый 27.08.2014, 19:40   #3  
dax_ is offline
dax_
Участник
 
7 / 10 (1) +
Регистрация: 27.08.2014
Спасибо за ссылку. Но в предыдущей теме обсуждение закончилось на том, что нужно подключаться через Net. На сайте MySQL есть только 32-битная версия коннектора, мне же нужно получить доступ к БД MySQL именно с АОС, а он в АХ2012 - 64-битный.

Основная проблема не коннектом, а с тем, что команда
X++:
resultSet = statement.executeQuery(sql);
ничего НЕ возвращает в resultSet. Пишет - No row selected.

Может у кого-то есть мысли на этот счет?
Старый 27.08.2014, 20:49   #4  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Попробую высказать свое фэ по этому решению.
1 Не правильно держать коннекшены к другим базам данных из приложения Dynamics AX, по многим причинам (загрузка канала связи, не тот уровень исполнения, небезопасно и т.д). Скорее всего это даже не локальная инфраструктура, а через инет. И что будет в случае обрыва связи?
2 Настройка DSN привязана к конкретному AOS скорее всего. А если вы заходите с мигрировать на другой компьютер, где этой настройки нет и кто будет об это кроме разработчика помнить?

Пока не запустили, мое мнение - одумайтесь и переделайте на отправку и получения пакетов в формате .xml или .csv.
Атомарно.
Легко переносимо.
Не требует танцев с бубнами.
__________________
Axapta book for developer
За это сообщение автора поблагодарили: mazzy (2).
Старый 27.08.2014, 20:57   #5  
dax_ is offline
dax_
Участник
 
7 / 10 (1) +
Регистрация: 27.08.2014
MikeR спасибо за совет. А примера отправки/получения пакетов в формате .xml или .csv в MySQL у вас случайно под рукой нет?
Старый 27.08.2014, 22:33   #6  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
856 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
забудьте про ODBC. это архаизм из 90х годов
если у MySQL есть поддержка WCF, то проще всего тупо на .Net в AX использовать его
как консумировать сервисы в AX вот пример http://technet.microsoft.com/en-us/l.../hh500185.aspx

WCF использует XML но про это думать не нужно
там всё на более абстрактном уровне делается

книжка кстати где-то есть про сервисы в ax2012, тоже полезно будет почитать
p.s. если не получится - пишите мне, я за $$$ вам сделаю всё

Последний раз редактировалось lvan; 27.08.2014 в 22:48.
Старый 27.08.2014, 23:27   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
еще вариант
Настроить на "родном" SQL-сервере Linked Server (MyServer). Задать там все параметры подключения, проверить и передать на поддержку админам. А из аксы получать данные простым запросом через UserConnection - SELECT * FROM MyServer.MyDB..MyTable
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 27.08.2014, 23:33   #8  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
Цитата:
Сообщение от lvan Посмотреть сообщение
забудьте про ODBC. это архаизм из 90х годов
если у MySQL есть поддержка WCF, то проще всего тупо на .Net в AX использовать его
с ODBC просто сделать синхронизацию транзакций, как это сделать с WCF ?
Старый 28.08.2014, 00:11   #9  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
856 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
не уверен, что понял ваш вопрос
что именно нужно синхронизировать?
ttsbegin/commit?

вот первая ссылка из гугла http://msdn.microsoft.com/en-us/library/ff384250.aspx

Последний раз редактировалось lvan; 28.08.2014 в 00:15.
За это сообщение автора поблагодарили: dech (0).
Старый 28.08.2014, 09:50   #10  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
Цитата:
Сообщение от lvan Посмотреть сообщение
не уверен, что понял ваш вопрос
что именно нужно синхронизировать?
ttsbegin/commit?
синхронизировать ttsbegin/ttscommit с внешними транзакциями
выше, например, упоминали Linked Server - транзакции синхронизируются с помощью сервиса DTS без какого то участия, надо только настроить DTS
с ODBC тоже проблем нет

никогда не сталкивался с WCF с этой точки зрения и вот возник вопрос, насколько я понял, по ссылке просто описания транзакционности WCF
Старый 28.08.2014, 11:00   #11  
dax_ is offline
dax_
Участник
 
7 / 10 (1) +
Регистрация: 27.08.2014
Хотелось поблагодарить всех участников за высказанное мнение, но все таки, если принять за аксиому то, что нужен доступ к MySQL через ODBC - в чем причина отсутствия каких-либо данных в resultset?

Немного дополнительной информации:
Версия MySQL - 3.51. Версия 32-битного драйвера на клиенте - 3.51.06
Код выполняется из джоба на 32-битном клиенте. Коннект к БД точно есть, так как при наличии ошибок в запросе система реагирует соответствующими информационными сообщениями.

При попытке выполнить данный джоб на сервере АОС (64 битная архитектура) сначала ругалось на отсутствие драйвера MySQL ODBC на сервере.

Нашли 64-битный драйвер - версия 3.51.30. Установили сразу оба (32-битный и 64 битный), каждый в свою папку.

В результате при выполнении этого же джоба с 32-битного клиента непосредственно на сервере АОС (через драйвер версии 3.51.30) коннект к базе не происходит: [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию
Очевидно он не воспринимает строку подключения, которая отлично работает на 32-битном драйвере версии 3.51.06.

При этом, если явно указать 32-битный DSN, какой-то коннект вроде происходит, но при передаче значений в resultset выдает следующее:
Описание ошибки SQL: [Microsoft Dynamics AX] Unable to retrieve message for retval -1, ODBC call reason code 100,
SQLSTATE = []
Error message []

На явные ошибки в тексте запроса (неверное имя поля, таблицы, команды) не реагирует.

Аналогичный эффект наблюдается при выполнении кода непосредственно на 64-битном сервере АОС через 64-битный драйвер.
Старый 29.08.2014, 08:33   #12  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Может действительно не стоит заморачиваться с MySQL?
Мы, если хотим получить данные из АХ для сторонних систем, используем Web-сервисы. Очень удобно и без геморроя.
__________________
// no comments
Старый 29.08.2014, 18:06   #13  
dax_ is offline
dax_
Участник
 
7 / 10 (1) +
Регистрация: 27.08.2014
Спасибо всем участникам обсуждения за дельные предложения. Получилось достучаться к БД MySQL по ODBC через .Net компоненту:
X++:
static public void Main(Args _args)
{

    System.Exception                    e;
    System.Data.Odbc.OdbcConnection     objConn;


    System.Data.Odbc.OdbcCommand        cmdSelect;
    System.Data.Odbc.OdbcDataReader     reader;
    InteropPermission                   perm;

    str exceptionStr, connectStr;
    ;
   
    connectStr = "Driver={MySQL ODBC 3.51 Driver};Server=myserver;Database=mydatabase;User=root;Password=123;Option=3;";
    try
    {
        perm = new InteropPermission(InteropKind::ClrInterop);
        if (perm == null)
        {
            throw error("Error with file permissions");
        }
        perm.assert();
        objConn = new System.Data.Odbc.OdbcConnection(connectStr);
        objConn.Open();
        cmdSelect   = objConn.CreateCommand();
        cmdSelect.set_CommandText("SELECT * FROM table");
        reader      = cmdSelect.ExecuteReader();
        while (reader.Read())
        {
            info(reader.GetString(0));
        }
    }
    catch(Exception::CLRError)
    {
        CodeAccessPermission::revertAssert();
        perm = new InteropPermission(InteropKind::ClrInterop);
        if (perm == null)
        {
            return;
        }
        perm.assert();
        e = ClrInterop::getLastException();
        CodeAccessPermission::revertAssert();
        while( e )
        {
            exceptionStr += e.get_Message();
            e = e.get_InnerException();
        }
        info(exceptionStr);
    }
    catch
    {
        error("An Exception has occurred");
    }
    if(objConn)
        objConn.Close();

}
Правда данный код у меня работает ТОЛЬКО с 32-битной версией драйвера MySQL ODBC 3.51.06.

Оба драйвера версии 3.51.30 (32-битный и 64-битный) пока молчат. Будут результаты - отпишусь.
Старый 10.09.2014, 11:41   #14  
dax_ is offline
dax_
Участник
 
7 / 10 (1) +
Регистрация: 27.08.2014
С драйверами разобрались - все заработало на версии 3.51.29, удалось достучаться к базе через .Net и с 32-битного клиента, и с 64-битного сервера.
Старый 13.08.2018, 17:56   #15  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от dax_ Посмотреть сообщение
С драйверами разобрались - все заработало на версии 3.51.29, удалось достучаться к базе через .Net и с 32-битного клиента, и с 64-битного сервера.
А в чем было дело, что не работало ?
Старый 13.08.2018, 18:36   #16  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от MikeR Посмотреть сообщение
Попробую высказать свое фэ по этому решению.
1 Не правильно держать коннекшены к другим базам данных из приложения Dynamics AX, по многим причинам (загрузка канала связи, не тот уровень исполнения, небезопасно и т.д). Скорее всего это даже не локальная инфраструктура, а через инет. И что будет в случае обрыва связи?
2 Настройка DSN привязана к конкретному AOS скорее всего. А если вы заходите с мигрировать на другой компьютер, где этой настройки нет и кто будет об это кроме разработчика помнить?

Пока не запустили, мое мнение - одумайтесь и переделайте на отправку и получения пакетов в формате .xml или .csv.
Атомарно.
Легко переносимо.
Не требует танцев с бубнами.
Цитата:
Сообщение от dech Посмотреть сообщение
Может действительно не стоит заморачиваться с MySQL?
Мы, если хотим получить данные из АХ для сторонних систем, используем Web-сервисы. Очень удобно и без геморроя.
Не всегда так однозначно. Предположим что это прототип и Agile. Иногда имеет смысл, если это возможно, сделать как можно проще первоначально.

То есть если можно за 2 дня обеспечить доступ к MySQL через .NET Interop из X++ и получить работающее решение то именно так и стоит сделать. И решать проблемы по мере их поступления.

Web-сервисы это хорошо но дорого по стоимости разработки. Имеют смысл когда четко понятно что требуется. При этом конечно надо писать код так чтобы легко заменить этот слой логики на WS.
Старый 13.08.2018, 19:19   #17  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от ax_mct Посмотреть сообщение
...и получить работающее решение то именно так и стоит сделать...
Работающее, но не обновляемое.
Старый 13.08.2018, 21:03   #18  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от EVGL Посмотреть сообщение
Работающее, но не обновляемое.
Одно дело когда это заказ и консалтинг заинтересован сделать проект более дорогим прикрываясь непобиваемой правильностью веб-сервисов.

И совсем другое когда это внутренний проект где в интранете и AX и PHP приложение. Тут принцип KISS имеет все основания быть примененным.

Или прототипирование для сбора дальнейших требований. Где о правильности вообще надо забывать.
Старый 14.08.2018, 08:26   #19  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Web-сервисы это хорошо но дорого по стоимости разработки. Имеют смысл когда четко понятно что требуется. При этом конечно надо писать код так чтобы легко заменить этот слой логики на WS.
Поясните, в чем именно высока стоимость разработки?
А когда нечетко понятно, что требуется, то х**к, х**к и в продакшн?
__________________
// no comments
Старый 14.08.2018, 14:35   #20  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от dech Посмотреть сообщение
Поясните, в чем именно высока стоимость разработки?
А когда нечетко понятно, что требуется, то х**к, х**к и в продакшн?
Доступ к сторонней базе остается программированием в AX и делом одного человека. Пусть даже и через NET прокси. Два дня.

Использование веб-сервисов это не просто удаленный вызов, это уже интеграция двух систем.
Работа с двух сторон, документация, согласования, координация действий, тестирование и настройки. Двадцать дней.

х**к, х**к он безотносителен к способу.
Веб-сервисы как универсальный способ это неправильно.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX: Microsoft Dynamics AX 2012 R3 is now available! Blog bot DAX Blogs 1 02.05.2014 23:00
DAX: Microsoft Dynamics AX 2012 R3 global online launch event: April 10, 2014 Blog bot DAX Blogs 0 19.03.2014 07:11
amer-ax: It was a great day! Blog bot DAX Blogs 3 29.12.2012 01:02
emeadaxsupport: Final Microsoft Dynamics AX 2012 R2 Content Available! Blog bot DAX Blogs 0 04.12.2012 06:12
dynamics-community.at: Dynamics AX 2012 Trainings Blog bot DAX auf Deutsch 0 19.06.2012 18:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:50.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.