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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.05.2012, 19:37   #1  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
Ошибка с подключением через ODBC + глюк с работой через connection
Ситуация такая: на работающем приложении в 3.0 для одной обработки используется подключение через ODBC к своей же базе. По словам разработчика, заставить эту обработку работать через new connection() не вышло, а через ODBC всё ок.
Сейчас переношу это на DAX 2009, ни так ни так не выходит.
MS SQL 2008 R2
Подключение ODBC создаётся так:
X++:
static void testODBCConnection(Args _args)
{
    ODBCConnection con;
    LoginProperty   LP = new LoginProperty();
    ;
    LP.setServer("Server");
    LP.setDatabase("DB");
    LP.setOther(strfmt("Username=%1;Password=%2", "user", "pwd"));

    con = new ODBCConnection(LP);

}
Выдаётся ошибка: "[Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию".
Пароль и пользователь проверены. Вопрос с открытым паролем в коде пока что на втором месте после "заставить это работать". На клиентских машинах DSN создавать не хочется. На сервере DSN имеется, тестовое соединение проходит на ура, но LP.setDSN("DSN") даёт ту же картину.
Если я правильно понимаю, DSN можно вообще не иметь, он создаётся на время
подключения.

Но вообще, конечно, через ODBC к своей базе коннектиться не комильфо, поэтому пытаюсь подключиться через new connection(), но тут своя засада.

X++:
    stm = con.createStatement();
    cmd = "begin tran";
    new SqlStatementExecutePermission(cmd).assert();
    stm.executeUpdate(cmd);
    CodeAccessPermission::revertAssert();

    cmd = strfmt("insert LocksTable (purchid, transdate, blocked, dataareaid, recid) " +
               "values ('%1',getdate(),1,'%2', convert(int,@@dbts))", purchid, curext());
    new SqlStatementExecutePermission(cmd).assert();
    stm.executeUpdate(cmd);
    CodeAccessPermission::revertAssert();

/*
обработка
*/

    cmd = "rollback tran";
    new SqlStatementExecutePermission(cmd).assert(); 
    stm.executeUpdate(cmd); // <-- здесь вываливается ошибка SQL
    CodeAccessPermission::revertAssert();
После этого вылета наблюдается следующий глюк: запись в таблице LocksTable остаётся, но удалить её из обозревателя таблиц кнопочкой "удалить запись" не получается - после F5 она остаётся на месте. Запись удаляется только запросом Delete_from.

Есть идеи, что это может быть?

Последний раз редактировалось Corel; 15.05.2012 в 19:40.
За это сообщение автора поблагодарили: NataLee (1).
Старый 15.05.2012, 21:22   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Это все где выполняется? На стороне клиента или на стороне сервера? Там где это выполняется соответствующий драйвер ODBC установлен?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 16.05.2012, 07:38   #3  
Dark Light is offline
Dark Light
Участник
 
64 / 49 (0) +++
Регистрация: 17.02.2009
Адрес: Омск
Post
Для ODBC попробуйте так:
X++:
otherStr += "DRIVER={SQL Server}";
otherStr += ";Trusted_Connection=No";
otherStr += strfmt(";SERVER=%1",    ...);
otherStr += strfmt(";DataBase=%1",  ...);
otherStr += strfmt(";UID=%1",       ...);
otherStr += strfmt(";PWD=%1",       ...);
loginProp.setOther(otherStr);

По поводу Connection:
1) почему не использовать стандартные методы con.ttsbegin() и con.ttsabort()?
2) запрос на удаление к БД идет по уникальному ключу. Если ключ содержит текстовое поле, то проблема может быть в Adjustment'е.

Пример: поле Field имеет длину 10 символов. В Аксапте значение в этом поле равно "Код1". В БД оно может быть записано или как "Код1______", или как "______Код1" ("_" - это пробел). Это нужно учитывать при вставке через запрос.

Создайте 2 записи: одну из Аксапты, вторую - через запрос. И посмотрите, есть ли разница в текстовых полях.

Последний раз редактировалось Dark Light; 16.05.2012 в 08:00.
За это сообщение автора поблагодарили: NataLee (1), Corel (1).
Старый 16.05.2012, 15:40   #4  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Это все где выполняется? На стороне клиента или на стороне сервера? Там где это выполняется соответствующий драйвер ODBC установлен?
Класс работает на сервере, тестовый джоб на клиенте. И там и там в параметрах ODBC имеются драйвера SQL Native Client 10.0, и там и там настроен и проверен User DSN

Цитата:
Сообщение от Dark Light Посмотреть сообщение
Для ODBC попробуйте так:
X++:
otherStr += "DRIVER={SQL Server}";
otherStr += ";Trusted_Connection=No";
otherStr += strfmt(";SERVER=%1",    ...);
otherStr += strfmt(";DataBase=%1",  ...);
otherStr += strfmt(";UID=%1",       ...);
otherStr += strfmt(";PWD=%1",       ...);
loginProp.setOther(otherStr);
Так прошло. То есть, дело в драйвере или TrustedConnection, выходит?

Цитата:
Сообщение от Dark Light Посмотреть сообщение
По поводу Connection:
1) почему не использовать стандартные методы con.ttsbegin() и con.ttsabort()?
Попробовал - не то, т.к. в таком случае отменяются и транзакции, создаваемые обработкой (для записи в журнал). То есть, тут смысл такой: запросом к SQL создаются записи в таблице блокировок, чтоб аналогичные одновременно работающие обработки не мешали друг другу, создаются строки журнала, после чего идёт откат транзакции по таблице блокировок.

Насчёт Adjustment - проверю.
Старый 16.05.2012, 15:56   #5  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
мы используем системный dsn из настроек :
X++:
LP.setDSN(_odbcDSN);
полагаю, не надо напоминать (на всякий случай) что 32-х и 64-х битные драйвера ODBC настраиваются в разных местах ...
Старый 16.05.2012, 19:03   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Corel Посмотреть сообщение
Класс работает на сервере, тестовый джоб на клиенте. И там и там в параметрах ODBC имеются драйвера SQL Native Client 10.0, и там и там настроен и проверен User DSN
(...)
То есть, дело в драйвере или TrustedConnection, выходит?
Дело в том, что необходимо явным образом указать имя используемого драйвера. Вот этот фрагмент

Driver = {SQL Server}

В Вашем варианте это будет примерно так

X++:
static void testODBCConnection(Args _args)
{
    ODBCConnection con;
    LoginProperty   LP = new LoginProperty();
    ;
    LP.setServer("Server");
    LP.setDatabase("DB");
    LP.setUserName("user");
    LP.setPassword("pwd");
    // Фигураные скобки не обязательны
    LP.setOther("DRIVER={SQL Server}");
// Или если с Windows аутентификацией без указания логина/пароля
//    LP.setOther("DRIVER={SQL Server};Trusted_Connection=Yes");

    con = new ODBCConnection(LP);

}
Кстати, корректный синтаксис строк подключения можно посмотреть вот на этом сайте http://www.connectionstrings.com/
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: NataLee (1), driller (2), Player1 (1).
Старый 17.05.2012, 08:45   #7  
Dark Light is offline
Dark Light
Участник
 
64 / 49 (0) +++
Регистрация: 17.02.2009
Адрес: Омск
Цитата:
Сообщение от Corel Посмотреть сообщение
Попробовал - не то, т.к. в таком случае отменяются и транзакции, создаваемые обработкой (для записи в журнал).
Здесь лучше использовать класс UserConnetion. Он создает отдельное подключение к БД, и тогда данная схема сработает
X++:
Connection    con = new UserConnection();

ttsbegin;

con.ttsbegin();

//SQL запрос
...
//SQL запрос

//Обработка в Аксапте
...
//Обработка в Аксапте

con.ttsabort();

ttscommit;
Только тут нужно будет ещё сделать блок try/catch, чтобы в случае ошибки в catch'е вызвать con.ttsabort().

Цитата:
Сообщение от Corel Посмотреть сообщение
То есть, тут смысл такой: запросом к SQL создаются записи в таблице блокировок, чтоб аналогичные одновременно работающие обработки не мешали друг другу, создаются строки журнала, после чего идёт откат транзакции по таблице блокировок.
А из Аксапты доступа к данной таблице нет? Ведь гораздо будет проще в конце операции просто удалять нужную запись из LocksTable.

Последний раз редактировалось Dark Light; 17.05.2012 в 08:53.
Старый 17.05.2012, 11:01   #8  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
Нет, это обработка критична к быстродействию (там далеко не одна запись ставится каждый раз), а на запоминании, какие записи были созданы и на удалении их теряется довольно много.
Старый 17.05.2012, 11:58   #9  
Dark Light is offline
Dark Light
Участник
 
64 / 49 (0) +++
Регистрация: 17.02.2009
Адрес: Омск
Цитата:
Сообщение от Corel Посмотреть сообщение
Нет, это обработка критична к быстродействию (там далеко не одна запись ставится каждый раз), а на запоминании, какие записи были созданы и на удалении их теряется довольно много.
Если у таблицы включить поле createdTransactionId, то delete_from'ом удаляется также быстро, как и при откате транзакции.

X++:
delete_from LocksTable
        where LocksTable.createdTransactionId   == appl.lastTransactionIdCreated();
При условии, что записи в LocksTable регулярно чистятся и таблица не разрастается. Иначе, возможно, придется делать индекс по createdTransactionId.

Последний раз редактировалось Dark Light; 17.05.2012 в 13:01.
Теги
odbc, ax2009

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axilicious:IDMF Post Installation Issue : ODBC Connection Blog bot DAX Blogs 0 28.01.2011 23:14
Update ошибка в ODBC Oracle Link DAX: Программирование 2 03.12.2010 14:58
Ошибка с работой Business Connector через ISS. Dimonishe DAX: Программирование 2 01.08.2006 15:14
Чтение данных из SQL Server через ODBC. Не работает в 3-х звенке sukhanchik DAX: Программирование 7 30.05.2005 17:52
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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