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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.01.2009, 12:53   #1  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
? и еще раз вызов хранимых процедур
Добрый день, уважаемые посетители форума
Вызываю хранимую процедуру SQL из кода Axapta. Код следующий.

X++:
OdbcConnection          OdbcCon;
    Statement               st;
    ResultSet               resultSet;
    str                     str_st;
    LoginProperty           LP = new LoginProperty();
    ;

    super();

    ttsbegin;

    select _pccs;

    if (_pccs)
    {
        LP.setServer(_pccs.DSN);
        LP.setDatabase(_pccs.DBName);
        LP.setUsername(_pccs.Login);
        LP.setPassword(_pccs.Password);

        OdbcCon = new OdbcConnection(LP);
        st = OdbcCon.createStatement();

        str_st = StrFmt("exec [dbo].[SelectAndUpdateStatusSN_ForAXDB] 31, '%1'", date2str(today(),213,2,3,2,3,4));
        // str_st ="exec [dbo].[SelectAndUpdateStatusSN_ForAXDB] @UserID=31, @bDate=Convert(DATETIME, '2009-01-20 11:51:07.000', 102)";
        // str_st = "exec [dbo].[SelectAndUpdateStatusSN_ForAXDB] 31, N'20.01.09'";

        resultSet = st.executeQuery(str_st);

        while (resultSet.next()) // вот здесь происходит ошибка
        {
            str_st = resultSet.getString(1);
            str_st = resultSet.getString(2);
            str_st = resultSet.getString(3);
            str_st = resultSet.getString(4);
            str_st = resultSet.getString(5);
            str_st = resultSet.getString(6);
            str_st = resultSet.getString(7);
            str_st = resultSet.getString(8);
        }
    }

    ttscommit;
Возникает ошибка.

Невозможно выбрать запись в '' ('')
База данных SQL обнаружила ошибку.
Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver][SQL Server]Параметры языка изменены на "русский".
Оператор SQL: exec [dbo].[SelectAndUpdateStatusSN_ForAXDB] 31, '01-20-2009'


В чем причина? Что делать?
__________________
AX 3.0, Build #9.3
Старый 20.01.2009, 13:15   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
хранимая процедура не возвращает записи. Если только она не состоит из одного селекта.
Вам нужно делать табличную функцию и вызывать ее не через exec, а через select
__________________
Возможно сделать все. Вопрос времени
Старый 20.01.2009, 13:19   #3  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
А если в хранимой процедуре будет только select, такой вариант отработает?
__________________
AX 3.0, Build #9.3
Старый 20.01.2009, 13:44   #4  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
хранимая процедура не возвращает записи.
Ну неправда-же!
ХП МОЖЕТ возвращать записи, просто получить их не так просто, как из ф-ии. Вариантов несколько - через временную таблицу (SQL-ную, а не Аксаптовскую ), через OPENQUERY.
Хотя, конечно, если укладывашься в ограничения UDF, то лучше использовать их.

Последний раз редактировалось egorych; 20.01.2009 в 13:47.
Старый 20.01.2009, 13:48   #5  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Сообщение от egorych Посмотреть сообщение
через OPENQUERY.
А вот про это поподробней можно?
__________________
AX 3.0, Build #9.3
Старый 20.01.2009, 14:04   #6  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
ну, например так
X++:
select * from openquery(loopback, 'exec sp_who')
только на сервере должен быть настроен Linked Server (loopback) на самого себя.
Старый 20.01.2009, 14:28   #7  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Сообщение от egorych Посмотреть сообщение
ну, например так
X++:
select * from openquery(loopback, 'exec sp_who')
только на сервере должен быть настроен Linked Server (loopback) на самого себя.
Это, похоже, не мой случай. Ну да ладно. Всем спасибо
__________________
AX 3.0, Build #9.3
Старый 20.01.2009, 14:36   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Хранимые процедуры вполне нормально возвращают результаты (запросы). Однако есть некоторые "тонкости".

1. Дело в том, что ряд команд SQL-сервера возвращают нечто вроде "отчета" об успешном своем выполнении. В данном случае, вероятно, команда

X++:
SET LANGUAGE N'русский'
Т.е. факт выполнения этой команды привел к выдаче сообщения

Цитата:
Параметры языка изменены на "русский"
Это сообщение было воспринято как возвращаемый результат и передано в ResultSet. Но, поскольку это значение не является ResultSet, то на стороне клиента это вызвало ошибку.

Чтобы избежать подобных недоразумений необходимо первой командой внутри хранимой процедуры сделать такую настройку

X++:
SET NOCOUNT ON
Эта настройка подавляет подобные неуместные сообщения-отчеты

2. В качестве возвращаемого значений из хранимой процедуры при использовании statment.executeQuery() ожидается ResultSet. Он будет сформирован корректно в том случае, если последней исполняемой командой в хранимой процедуре будет запрос. Т.е. команда

SELECT ... FROM ...

OpenQuery() - в данном случае лишний.
Старый 20.01.2009, 14:39   #9  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от chanchala Посмотреть сообщение
Вызываю хранимую процедуру SQL из кода Axapta
А вот это напрасно
Цитата:
X++:
        while (resultSet.next()) // вот здесь происходит ошибка
В чем причина?
X++:
set nocount on 
set ansi_warnings off
в начале процедуры конечно же выставлены?
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: Logger (3).
Старый 20.01.2009, 14:40   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Кстати, константы типа Даты-Время лучше передавать как строку вида

'YYYYMMDD'

Это универсальный формат, не зависящий от текущех настроек формата даты сервера. Т.е. лучше формировать строку так

X++:
str_st = StrFmt("exec [dbo].[SelectAndUpdateStatusSN_ForAXDB] 31, '%1'", date2str(today(),321,2,0,2,0,4));
Старый 20.01.2009, 14:57   #11  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Хранимые процедуры вполне нормально возвращают результаты (запросы). Однако есть некоторые "тонкости".
Не буду спорить с гуру. В свое время с наскоку не получилось - вот и решил, что не возвращают. Был неправ.
__________________
Возможно сделать все. Вопрос времени
Старый 20.01.2009, 14:57   #12  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Сообщение от Vadik Посмотреть сообщение
А вот это напрасно

X++:
set nocount on 
set ansi_warnings off
в начале процедуры конечно же выставлены?
А вот этого не знаю. Процедуру писала не я и возможности посмотреть её код у меня нет, тем более поправить. Есть только возможность сформировать список претензий к разработчику процедуры
__________________
AX 3.0, Build #9.3
Старый 20.01.2009, 15:00   #13  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Хранимые процедуры вполне нормально возвращают результаты (запросы). Однако есть некоторые "тонкости".
...
Понятно и полезно. Спасибо. Отправлю в качестве советов разработчику хранимой процедуры. Надеюсь, поможет
__________________
AX 3.0, Build #9.3
Теги
sql, хранимые процедуры

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов метода element.args().caller().setOfficialsParams(.... Poleax DAX: Программирование 6 04.09.2008 19:49
Вызов метода базового класса Eldar9x DAX: Программирование 15 22.03.2008 19:10
Вызов экспортируемой функции DLL Jabberwocky DAX: Программирование 8 12.09.2006 17:20
вызов хранимых процедур из Ax 3.0 Антон Солдатов DAX: Программирование 2 19.08.2004 16:48
Вызов формы, не модифицируя ее заголовка AndrewP DAX: Программирование 1 04.07.2003 14:20

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

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

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