27.08.2014, 17:23 | #1 |
Участник
|
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 |
MCP
|
Подключение к MySQL обсуждалось в этой теме
__________________
AXIOMA |
|
27.08.2014, 19:40 | #3 |
Участник
|
Спасибо за ссылку. Но в предыдущей теме обсуждение закончилось на том, что нужно подключаться через Net. На сайте MySQL есть только 32-битная версия коннектора, мне же нужно получить доступ к БД MySQL именно с АОС, а он в АХ2012 - 64-битный.
Основная проблема не коннектом, а с тем, что команда X++: resultSet = statement.executeQuery(sql); Может у кого-то есть мысли на этот счет? |
|
27.08.2014, 20:49 | #4 |
MCT
|
Попробую высказать свое фэ по этому решению.
1 Не правильно держать коннекшены к другим базам данных из приложения Dynamics AX, по многим причинам (загрузка канала связи, не тот уровень исполнения, небезопасно и т.д). Скорее всего это даже не локальная инфраструктура, а через инет. И что будет в случае обрыва связи? 2 Настройка DSN привязана к конкретному AOS скорее всего. А если вы заходите с мигрировать на другой компьютер, где этой настройки нет и кто будет об это кроме разработчика помнить? Пока не запустили, мое мнение - одумайтесь и переделайте на отправку и получения пакетов в формате .xml или .csv. Атомарно. Легко переносимо. Не требует танцев с бубнами.
__________________
Axapta book for developer |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
27.08.2014, 20:57 | #5 |
Участник
|
MikeR спасибо за совет. А примера отправки/получения пакетов в формате .xml или .csv в MySQL у вас случайно под рукой нет?
|
|
27.08.2014, 22:33 | #6 |
Участник
|
забудьте про 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 |
----------------
|
еще вариант
Настроить на "родном" SQL-сервере Linked Server (MyServer). Задать там все параметры подключения, проверить и передать на поддержку админам. А из аксы получать данные простым запросом через UserConnection - SELECT * FROM MyServer.MyDB..MyTable |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
27.08.2014, 23:33 | #8 |
Участник
|
|
|
28.08.2014, 00:11 | #9 |
Участник
|
не уверен, что понял ваш вопрос
что именно нужно синхронизировать? 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 |
Участник
|
Цитата:
выше, например, упоминали Linked Server - транзакции синхронизируются с помощью сервиса DTS без какого то участия, надо только настроить DTS с ODBC тоже проблем нет никогда не сталкивался с WCF с этой точки зрения и вот возник вопрос, насколько я понял, по ссылке просто описания транзакционности WCF |
|
28.08.2014, 11:00 | #11 |
Участник
|
Хотелось поблагодарить всех участников за высказанное мнение, но все таки, если принять за аксиому то, что нужен доступ к 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 |
Участник
|
Может действительно не стоит заморачиваться с MySQL?
Мы, если хотим получить данные из АХ для сторонних систем, используем Web-сервисы. Очень удобно и без геморроя.
__________________
// no comments |
|
29.08.2014, 18:06 | #13 |
Участник
|
Спасибо всем участникам обсуждения за дельные предложения. Получилось достучаться к БД 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(); } Оба драйвера версии 3.51.30 (32-битный и 64-битный) пока молчат. Будут результаты - отпишусь. |
|
10.09.2014, 11:41 | #14 |
Участник
|
С драйверами разобрались - все заработало на версии 3.51.29, удалось достучаться к базе через .Net и с 32-битного клиента, и с 64-битного сервера.
|
|
13.08.2018, 17:56 | #15 |
Участник
|
|
|
13.08.2018, 18:36 | #16 |
Banned
|
Цитата:
Сообщение от MikeR
Попробую высказать свое фэ по этому решению.
1 Не правильно держать коннекшены к другим базам данных из приложения Dynamics AX, по многим причинам (загрузка канала связи, не тот уровень исполнения, небезопасно и т.д). Скорее всего это даже не локальная инфраструктура, а через инет. И что будет в случае обрыва связи? 2 Настройка DSN привязана к конкретному AOS скорее всего. А если вы заходите с мигрировать на другой компьютер, где этой настройки нет и кто будет об это кроме разработчика помнить? Пока не запустили, мое мнение - одумайтесь и переделайте на отправку и получения пакетов в формате .xml или .csv. Атомарно. Легко переносимо. Не требует танцев с бубнами. Цитата:
То есть если можно за 2 дня обеспечить доступ к MySQL через .NET Interop из X++ и получить работающее решение то именно так и стоит сделать. И решать проблемы по мере их поступления. Web-сервисы это хорошо но дорого по стоимости разработки. Имеют смысл когда четко понятно что требуется. При этом конечно надо писать код так чтобы легко заменить этот слой логики на WS. |
|
13.08.2018, 19:19 | #17 |
Banned
|
|
|
13.08.2018, 21:03 | #18 |
Banned
|
Одно дело когда это заказ и консалтинг заинтересован сделать проект более дорогим прикрываясь непобиваемой правильностью веб-сервисов.
И совсем другое когда это внутренний проект где в интранете и AX и PHP приложение. Тут принцип KISS имеет все основания быть примененным. Или прототипирование для сбора дальнейших требований. Где о правильности вообще надо забывать. |
|
14.08.2018, 08:26 | #19 |
Участник
|
Цитата:
А когда нечетко понятно, что требуется, то х**к, х**к и в продакшн?
__________________
// no comments |
|
14.08.2018, 14:35 | #20 |
Banned
|
Цитата:
Использование веб-сервисов это не просто удаленный вызов, это уже интеграция двух систем. Работа с двух сторон, документация, согласования, координация действий, тестирование и настройки. Двадцать дней. х**к, х**к он безотносителен к способу. Веб-сервисы как универсальный способ это неправильно. |
|
|
|