20.01.2009, 12:53 | #1 |
Участник
|
и еще раз вызов хранимых процедур
Добрый день, уважаемые посетители форума
Вызываю хранимую процедуру 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 |
Administrator
|
хранимая процедура не возвращает записи. Если только она не состоит из одного селекта.
Вам нужно делать табличную функцию и вызывать ее не через exec, а через select
__________________
Возможно сделать все. Вопрос времени |
|
20.01.2009, 13:19 | #3 |
Участник
|
А если в хранимой процедуре будет только select, такой вариант отработает?
__________________
AX 3.0, Build #9.3 |
|
20.01.2009, 13:44 | #4 |
Участник
|
Ну неправда-же!
ХП МОЖЕТ возвращать записи, просто получить их не так просто, как из ф-ии. Вариантов несколько - через временную таблицу (SQL-ную, а не Аксаптовскую ), через OPENQUERY. Хотя, конечно, если укладывашься в ограничения UDF, то лучше использовать их. Последний раз редактировалось egorych; 20.01.2009 в 13:47. |
|
20.01.2009, 13:48 | #5 |
Участник
|
__________________
AX 3.0, Build #9.3 |
|
20.01.2009, 14:04 | #6 |
Участник
|
ну, например так
X++: select * from openquery(loopback, 'exec sp_who') |
|
20.01.2009, 14:28 | #7 |
Участник
|
Это, похоже, не мой случай. Ну да ладно. Всем спасибо
__________________
AX 3.0, Build #9.3 |
|
20.01.2009, 14:36 | #8 |
Участник
|
Хранимые процедуры вполне нормально возвращают результаты (запросы). Однако есть некоторые "тонкости".
1. Дело в том, что ряд команд SQL-сервера возвращают нечто вроде "отчета" об успешном своем выполнении. В данном случае, вероятно, команда X++: SET LANGUAGE N'русский' Цитата:
Параметры языка изменены на "русский"
Чтобы избежать подобных недоразумений необходимо первой командой внутри хранимой процедуры сделать такую настройку X++: SET NOCOUNT ON 2. В качестве возвращаемого значений из хранимой процедуры при использовании statment.executeQuery() ожидается ResultSet. Он будет сформирован корректно в том случае, если последней исполняемой командой в хранимой процедуре будет запрос. Т.е. команда SELECT ... FROM ... OpenQuery() - в данном случае лишний. |
|
20.01.2009, 14:39 | #9 |
Модератор
|
А вот это напрасно
Цитата:
X++: while (resultSet.next()) // вот здесь происходит ошибка X++: set nocount on set ansi_warnings off
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Logger (3). |
20.01.2009, 14:40 | #10 |
Участник
|
Кстати, константы типа Даты-Время лучше передавать как строку вида
'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 |
Administrator
|
Не буду спорить с гуру. В свое время с наскоку не получилось - вот и решил, что не возвращают. Был неправ.
__________________
Возможно сделать все. Вопрос времени |
|
20.01.2009, 14:57 | #12 |
Участник
|
А вот этого не знаю. Процедуру писала не я и возможности посмотреть её код у меня нет, тем более поправить. Есть только возможность сформировать список претензий к разработчику процедуры
__________________
AX 3.0, Build #9.3 |
|
20.01.2009, 15:00 | #13 |
Участник
|
Понятно и полезно. Спасибо. Отправлю в качестве советов разработчику хранимой процедуры. Надеюсь, поможет
__________________
AX 3.0, Build #9.3 |
|