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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.08.2013, 18:44   #1  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Добрый вечер, уважаемые коллеги.
Разобрался с этой темой, но не до конца. В хранимой процедуре обращаюсь к другой БД, извлекаю из нее данные, читаю в AX следующим методом:
X++:
public static server void testExport()
{
    Connection          conn;
    Statement           stmt;
    str                 expr = "EXEC [dbo].[usp_DenisTest]";
    ResultSet           rs;
    SqlStatementExecutePermission   perm = new SqlStatementExecutePermission(expr);
    ;

    conn = new Connection();

    perm.assert();

    stmt = conn.createStatement();

    // BP deviation documented
    rs = stmt.executeQuery(expr);

    while (rs.next())
    {
        info(rs.getString(1));
    }

    rs.close();

    CodeAccessPermission::revertAssert();
}
Текст хранимой процедуры - следующий:
X++:
USE [PRD]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_DenisTest]
AS
BEGIN
SELECT ProdId, WrkCtrId, ItemId FROM [CSF_PRD].[dbo].[SFMatl] AS SFMatl
WHERE SFMatl.CompanyId = 'dat'
  AND SFMatl.WrkCtrId = 'E01'
  AND SFMatl.PrOdId = 'W000004'

END
Главное - проставить в SQL Server разрешения на запуск нужной SP для AOS-аккаунта. Все отлично работает.
Но стоит только настроить процедуру на работу с временными таблицами, как возникает ошибка такого рода: SQL error description: [Microsoft][ODBC SQL Server Driver]Invalid cursor state
Вот текст процедуры, использующей временную таблицу:
X++:
USE [PRD]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_DenisTest2]
AS
BEGIN

SET NOCOUNT ON

CREATE TABLE #TempCustTable (
        AccountNum varchar(10) COLLATE Latin1_General_CI_AI
      , CustName varchar(50) COLLATE Latin1_General_CI_AI
)

INSERT INTO #TempCustTable (AccountNum, CustName)
SELECT AccountNum, Name FROM CustTable
WHERE CustTable.DataAreaId = 'dat'
  AND CustTable.Name LIKE 'S%'
  
SET NOCOUNT OFF

SELECT * FROM #TempCustTable

DROP TABLE #TempCustTable

END
Также пробовал менять SET NOCOUNT, но как видите, особого результата не добился.
Может кто-нибудь подсказать, как мне использовать временные таблицы на стороне SQL Server, чтобы можно было нормально прочитать выборку в AX?
P.S. Спешу напомнить, что мне обязательно нужно обратиться к другой базе, поэтому использую хранимые процедуры.
__________________
// no comments

Последний раз редактировалось dech; 08.08.2013 в 18:47.
Старый 09.08.2013, 18:41   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,719 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от dech Посмотреть сообщение
Но стоит только настроить процедуру на работу с временными таблицами, как возникает ошибка такого рода: SQL error description: [Microsoft][ODBC SQL Server Driver]Invalid cursor state
Вот текст процедуры, использующей временную таблицу:
X++:
BEGIN

SET NOCOUNT ON

(...)  

SET NOCOUNT OFF

(...)

END
Также пробовал менять SET NOCOUNT, но как видите, особого результата не добился.
Может кто-нибудь подсказать, как мне использовать временные таблицы на стороне SQL Server, чтобы можно было нормально прочитать выборку в AX?
SET NOCOUNT ON надо устанавливать один раз. В начале процедуры. И больше ее не трогать. Она влияет только и исключительно на некие служебные сообщения. Некий "отчеты" об успешности или не успешности выполнения той или иной команды. Подавляет "статистику" выполнения команды. Вывод результатов прямых команд SELECT-SQL - не подавляет

Вы сами спровоцировали ошибку снова включив ее перед выполнением служебной команды DROP TABLE. Т.е. завершающая команда DROP TABLE #TempCustTable при настройке SET NOCOUNT OFF привела к формированию некоего "мусора" который и вызвал ошибку ODBC.

PS: Правилом хорошего тона считается предварительно проверить факт существования таблицы как перед ее созданием, так и перед ее удалением. Т.е. обычно пишут так

X++:
begin
SET NOCOUNT ON

if object_id('Tempdb..#TempCustTable') is not null DROP TABLE #TempCustTable

create table #TempCustTable (...)

insert ...
select ...

if object_id('Tempdb..#TempCustTable') is not null DROP TABLE #TempCustTable
end
Цитата:
Сообщение от dech Посмотреть сообщение
P.S. Спешу напомнить, что мне обязательно нужно обратиться к другой базе, поэтому использую хранимые процедуры.
Для этого хранимая процедура не обязательно. Вы вполне можете добавить обращение к другой базе в прямом запросе. Т.е. "FROM [CSF_PRD].[dbo].[SFMatl]" можно написать напрямую в команде передаваемой в stmt.executeQuery()
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View Blog bot DAX Blogs 0 12.12.2012 13:11
Connection к другому SQL Server Poleax DAX: Программирование 5 19.10.2010 10:49

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

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

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