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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.01.2012, 10:46   #1  
Raven13 is offline
Raven13
Участник
 
9 / 15 (1) ++
Регистрация: 25.06.2010
Post TimeOut в UserConnection
Доброго времени суток!

Столкнулся со следующей проблемой в DAX2009 SP1, используя класс UserConnection вызываю хранимую процедуру время выполнения, которой в среднем от одной минуты до пяти минут в зависимости от объема данных. Вызов в ахапке выполняется без ошибок, только вот результатов нет. Используя профайлер SQL Server выявил, что вызов хранимой процедуры заканчивается с ошибкой 2 - Abort, хотя если вызвать процедуру из SQL Management Studio выполнение не прерывается.

Так вызываю процедуру используя UserConnection:
X++:
    UserConnection             sqlConnection;
    Statement                     sqlStatement;
    Source                          sqlSource = strfmt("EXEC [dbo].[%1]", _procName);
    SqlStatementExecutePermission sqlPermission;
    ;
    sqlConnection = new UserConnection();
    sqlStatement  = sqlConnection.createStatement();

    sqlPermission = new SqlStatementExecutePermission(sqlSource);
    sqlPermission.assert();

    sqlStatement.executeUpdate(sqlSource);
    sqlStatement.close();

    CodeAccessPermission::revertAssert();
Сейчас удалось решить проблему следующим образом:

X++:
    System.Data.SqlClient.SqlConnection connection;
    System.Data.SqlClient.SqlCommand   command;
    System.Exception  e;
    
    SysSQLSystemInfo   systemInfo =  SysSQLSystemInfo::construct();
    CodeAccessPermission perm = new InteropPermission(InteropKind::ClrInterop);
    ;
    connection = new System.Data.SqlClient.SqlConnection(
        strfmt("Data Source=%1;Initial Catalog=%2;Integrated Security=True",
            systemInfo.getLoginServer(),
            systemInfo.getloginDatabase()));

    command = connection.CreateCommand();

    command.set_CommandText(_procName);
    command.set_CommandType(System.Data.CommandType::StoredProcedure);
    command.set_CommandTimeout(10 * 60);

    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    catch (Exception::CLRError)
    {
        e = ClrInterop::getLastException();
        while(e)
        {
            error(e.get_Message());
            e = e.get_InnerException();
        }
    }
    if (connection.get_State() == System.Data.ConnectionState::Open)
        connection.Close();

    CodeAccessPermission::revertAssert();
Собственно вопрос возможно ли установить Timeout для UserConnection?

Последний раз редактировалось Raven13; 29.01.2012 в 10:58.
Старый 30.01.2012, 20:51   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
UserConnection, теоретически, должен использовать ODBC-подключение. Посмотри в настройках собственно SQL-сервера, может там установлено ограничение на длительность выполнения запроса. Не базы, а именно SQL-сервера.

А, кроме того, в справке по классу Statement есть пример отлова ошибок исполнения

X++:
    Statement.executeUpdate(sql);
    print " Error code was: ", Statement.getLastError();
    print " Error message was '", Statement.getLastErrorText(), "'";
Может, "дело вовсе не в бобине" В смысле, ошибка не из-за timeoute происходит?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 31.01.2012, 09:22   #3  
Raven13 is offline
Raven13
Участник
 
9 / 15 (1) ++
Регистрация: 25.06.2010
Спасибо за ответ!

Цитата:
UserConnection, теоретически, должен использовать ODBC-подключение. Посмотри в настройках собственно SQL-сервера, может там установлено ограничение на длительность выполнения запроса. Не базы, а именно SQL-сервера.
Проверил, время ожидания удалённого запроса в секундах = 600, как и по умолчанию.

Цитата:
А, кроме того, в справке по классу Statement есть пример отлова ошибок исполнения
Я использовал этот метод отлова ошибок, при исполнении система ничего не выдавала (:

Цитата:
Может, "дело вовсе не в бобине" В смысле, ошибка не из-за timeoute происходит?
В первую очередь проверил свою хранимую процедуру, убрал все подозрительные инструкции, использование курсоров, оптимизировал саму процедуру, не помогло.
Пробовал комментировать часть процедуры и выполнять частями, в какой то момент процедура начала отрабатывать, но после включения самой "тяжелой" части процедуры снова результата не было.

Отмечу, что при использовании SqlCommand без set_CommandTimeout выполнение завершалось с ошибкой время ожидания запроса истекло, по этому я и сделал вывод, что проблема в том что истекает время исполнения запроса.

Последний раз редактировалось Raven13; 31.01.2012 в 09:25.
Старый 31.01.2012, 11:34   #4  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,893 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
На всякий случай спрошу: А у вас в хранимую процедуру добавлен оператор "SET NOCOUNT ON"?
Просто я однажды разбирался, почему хранимая процедура замечательно работает из SQL Management Studio, но валится на полпути при запуске из Connection. (При этом никаких кодов ошибки не возвращается, просто где-то посредине логики хранимка завершается).
Оказалось что из за того что SET NOCOUNT не стоял, все информационные сообщения о том что столько то записей обновлено, сохранялись в каком-то внутреннем буфере аксаптовского соединения.После того как буфер переполнялся, соединение автоматически аварийно завершалось, без выдачи какой-либо ошибки в Аксапту...

После вставки SET NOCOUNT ON в самое начало хранимой процедуры - все вылечилось...
За это сообщение автора поблагодарили: AlGol (2), eugene egorov (3),  (1), Logger (6), Ace of Database (3), lev (4), Raven13 (1).
Старый 31.01.2012, 12:46   #5  
Raven13 is offline
Raven13
Участник
 
9 / 15 (1) ++
Регистрация: 25.06.2010
Цитата:
После вставки SET NOCOUNT ON в самое начало хранимой процедуры - все вылечилось...
Интересная информация, сегодня обязательно проверю, Спасибо!
Старый 31.01.2012, 18:45   #6  
Raven13 is offline
Raven13
Участник
 
9 / 15 (1) ++
Регистрация: 25.06.2010
После добавление в процедуру SET NOCOUNT ON, всё заработало

Всем спасибо, тему можно закрывать.
Старый 28.08.2014, 20:44   #7  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Хочется добавить 5 копеек.
Имеем хранимую процедуру с SET NOCOUNT ON, вызываемую классом через UserConnection, всё работает в куче отчетов.
Стали дергать класс из 1С8 с помощью бизнес-коннектора, работает, но в Журнал трассировок (Ах3.0) после каждого вызова процедуры пишется "ошибка" типа QueryTime. Вроде работает и ладно, но неприятно.
На форуме нахожу пост и еще раз вызов хранимых процедур где люди используют для подключения класс OdbcConnection, подменил и в итоге ошибка пропала, а общее время сбора данных снизилось с 3:40 до 17сек.
За это сообщение автора поблагодарили: Logger (1).
Теги
execute, sql server

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Performance (Timeout) Problem with Microsoft Dynamics AX Enterprise Portal Blog bot DAX Blogs 0 10.10.2011 17:11
emeadaxsupport: Biztalk adapter connections timeout after 1 minute when syncTimeout is zero Blog bot DAX Blogs 0 30.09.2010 00:05
Проблема с UserConnection! foxtrot DAX: Прочие вопросы 2 23.12.2009 21:37
Есть ли в Аксапте какой-нибудь журнал трассировки вызываемых функций? Кирилл DAX: Программирование 9 09.04.2009 16:50
delay=pause=timeout=.. ? slava DAX: Программирование 7 30.09.2002 18:12

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

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

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