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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.07.2013, 08:51   #1  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Выполнение кода на стороне SQL Server
Всем добрый день. Вопрос уже обсуждался, я нашел кучу примеров, сделал все "правильно", но проблема осталась нерешенной. На самом деле мне нужно выполнить хранимую процедуру. Но даже обычный SELECT возвращает ошибку в методе executeQuery(). AX 4.0, у меня на сервере есть админские права.
Ошибка следующая:
Request for the permission of type 'SqlStatementExecutePermission' failed.
(S)\Classes\SqlStatementExecutePermission\demand
(S)\Classes\Statement\executeQuery
(C)\Jobs\sqlServerTest - line 18

X++:
public static server void sqlServerTest(Args _args)
{
    DictTable   dt      = new DictTable(tablenum(InventTable));
    str         sql     = strfmt("SELECT * FROM %1 WHERE %1.DataAreaId = '%2'",
                            dt.name(DbBackend::Sql)
                          , curext()
                          );
    Connection  conn    = new Connection();
    Statement   stmt    = conn.createStatement();
    ResultSet   rs;

    SqlStatementExecutePermission   perm = new SqlStatementExecutePermission(sql);
    ;

    perm.assert();

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

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

    CodeAccessPermission::revertAssert();
    info("OK");
}
__________________
// no comments

Последний раз редактировалось dech; 25.07.2013 в 08:56.
Старый 25.07.2013, 09:31   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
У вас джоб на клиенте работает !
X++:
C)\Jobs\sqlServerTest - line 18
Джобы игнорируют ключевое слово server.
Запускайте через меню итем или выносите код в статический метод класса.
За это сообщение автора поблагодарили: dech (1).
Старый 25.07.2013, 11:19   #3  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Спасибо большое. А как теперь выполнить хранимую процедуру, которая работает с другой базой данных на том же SQL Server? Пишет ошибку.
__________________
// no comments
Старый 25.07.2013, 11:41   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от dech Посмотреть сообщение
Спасибо большое. А как теперь выполнить хранимую процедуру, которая работает с другой базой данных на том же SQL Server? Пишет ошибку.
Поменять что-нибудь в процедуре
__________________
-ТСЯ или -ТЬСЯ ?
Старый 25.07.2013, 12:28   #5  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Цитата:
Сообщение от Logger Посмотреть сообщение
Джобы игнорируют ключевое слово server.
Запускайте через меню итем или выносите код в статический метод класса.
А если хочется по быстрому и не заморачиваться с созданием "лишних" объектов (менюитемы, статические методы), то можно примерно так:

X++:
static void JobOnServer(Args _args)
{
    Args                                    args;
    MenuFunction                            menuFunction;
    
    if (! isRunningOnServer())
    {
        args = new Args();
        args.parm("Message from Client");
        
        menuFunction = ClassFactory::makeObjectOnServer(classNum(MenuFunction));
        menuFunction.objectType(MenuItemObjectType::Job);
        menuFunction.object('JobOnServer');
        menuFunction.runOn(2);
        menuFunction.run(args);

        return;
    }
    
    info(_args.parm());
}
__________________
Кононов Пётр
Старый 25.07.2013, 12:33   #6  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
Сообщение от dech Посмотреть сообщение
Спасибо большое. А как теперь выполнить хранимую процедуру, которая работает с другой базой данных на том же SQL Server? Пишет ошибку.
А на основе вашего примера... не работает?... изменив sql на...
X++:
{
    str sql     = "USE otherDB EXEC storedProc parm1, parm2";
    Connection  conn    = new Connection();
    Statement   stmt    = conn.createStatement();
    ResultSet   rs;

    SqlStatementExecutePermission   perm = new SqlStatementExecutePermission(sql);
    ;

    perm.assert();

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

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

    CodeAccessPermission::revertAssert();
    info("OK");
}

Последний раз редактировалось ansoft; 25.07.2013 в 12:40.
Старый 25.07.2013, 12:55   #7  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Проверил... не работает... видно не хочет переключать БД... оно видно и правильно по безопасности
Остаеться как вариант через System.Data.SqlClient.SqlConnection... System.Data.SqlClient.SqlCommand и т.п.

Последний раз редактировалось ansoft; 25.07.2013 в 12:59.
Старый 25.07.2013, 13:13   #8  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
А через ODBCConnection тоже не работает?

X++:
    LoginProperty           loginProp;
    ODBCConnection          connection;

    loginProp               = new LoginProperty();
    loginProp.setServer('serverName');
    loginProp.setDatabase('databaseName');

    connection              = new ODBCConnection(loginProp);
}
__________________
Кононов Пётр
Старый 27.07.2013, 17:34   #9  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от pedrozzz Посмотреть сообщение
А через ODBCConnection тоже не работает?

X++:
    LoginProperty           loginProp;
    ODBCConnection          connection;

    loginProp               = new LoginProperty();
    loginProp.setServer('serverName');
    loginProp.setDatabase('databaseName');

    connection              = new ODBCConnection(loginProp);
}
Ну во-первых надо явно в коде прописывать логин/пароль.
А во вторых, если все-таки так и сделать, то:
Cannot execute the required database operation.
This function is no longer supported.

Даже, если вмето метода executeQuery() вызвать executeUpdate().
__________________
// no comments
Старый 28.07.2013, 09:56   #10  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
... у меня на сервере есть админские права
Цитата:
Ну во-первых надо явно в коде прописывать логин/пароль.
Trusted connection не пойдет?

Если нет острой необходимости запускать вызов на сервере, то можно через классы
CCADOConnection и CCADOCommand (они в стандарте клиентские).
Подключиться можно куда надо и вызвать что угодно... Работает 100% в нашей системе.
Возможно в строке подключения использовать Trusted connection (оно же Integrated Security=SSPI)
X++:
Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;
P.S. Мы изменили эти классы и теперь они работают и на серверной и на клиентской части.
На сервере работают и в пакетах выполняемых на сервере (у нас правда AX 2009 а не 4, однако указанные классы были еще и в 3)

Последний раз редактировалось ansoft; 28.07.2013 в 10:02.
Старый 28.07.2013, 23:56   #11  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Во-первых, процедуры запускаются через excuteUpdate.
Во-вторых, к соседней базе должен быть доступ у учетки, под которой АОС работает.

А все эти какаду и одибися под такую задачу не нужны.
Старый 29.07.2013, 09:20   #12  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
А все эти какаду и одибися под такую задачу не нужны.
Как переключиться в текущем соединении...
X++:
Connection  conn    = new Connection();
...на другую БД? Подскажите...
Ессно, при условии, что все права на SQL к БД настроены, т.е. есть для юзера АОСа и пусть даже для юзера из сессии которого все выполняется.
Старый 29.07.2013, 09:29   #13  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от ansoft Посмотреть сообщение
Как переключиться в текущем соединении...
...на другую БД? Подскажите...
переменная odbcConnection - член класса

X++:
#ODBCConnectionEntries
//инициализация класса
public boolean init(
                    str   _server,       //имя сервера
                    str     _database,     //база данных
                    str     _login,
                    str     _password
                    )
{
    LoginProperty     LP;
    str               otherStr;
    ;

        LP = new LoginProperty();

        otherStr = "DRIVER={SQL Server}";
        otherStr += ";Trusted_Connection=No";
        otherStr += strfmt(";SERVER=%1",    _server);
        otherStr += strfmt(";DataBase=%1",  _database);
        otherStr += strfmt(";UID=%1",       _login);
        otherStr += strfmt(";PWD=%1",       _password);
        LP.setOther(otherStr);

        odbcConnection = new OdbcConnection(LP);

        if (! odbcConnection)
        {
            return checkFailed("Ошибка при создании соединения");
        }

    return true;
}

Последний раз редактировалось Ace of Database; 29.07.2013 в 09:34.
Старый 29.07.2013, 09:38   #14  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от dech Посмотреть сообщение
А во вторых, если все-таки так и сделать, то:
Cannot execute the required database operation.
This function is no longer supported.

Вместо функций setServer и setDatabase надо вызывать setOther для класса LoginProperty

Последний раз редактировалось Ace of Database; 29.07.2013 в 09:40.
Старый 29.07.2013, 09:50   #15  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Спасибо вам Ace of Database, однако я хотел бы получить ответ для цитаты...
Цитата:
А все эти какаду и одибися под такую задачу не нужны.
Вы мне предложили варинт
Цитата:
одибися
:
X++:
odbcConnection = new OdbcConnection(LP);
P.S. Я как бы владею сменой БД для какаду, одибися и точкиНет
По большому счету
X++:
Connection  conn    = new Connection();
тоже одибися

Последний раз редактировалось ansoft; 29.07.2013 в 11:07.
Старый 29.07.2013, 10:22   #16  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Извините, я просто заметил знакомые буквы, поэтому среагировал и ответил. Глубины вопроса я не понял. Всегда пытаюсь делать тупо чтобы работало. Если по-тупому не работает, значит надо переосмыслить задачу, чтобы найти тупое решение, которое бы работало.
Старый 29.07.2013, 10:47   #17  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Извините, я просто заметил знакомые буквы, поэтому среагировал и ответил. Глубины вопроса я не понял. Всегда пытаюсь делать тупо чтобы работало. Если по-тупому не работает, значит надо переосмыслить задачу, чтобы найти тупое решение, которое бы работало.
Нормально... я тоже бывает реагирую на знакомые буквы
Интерес к вопросу тем не менее остался...

Последний раз редактировалось ansoft; 29.07.2013 в 10:50.
Старый 29.07.2013, 11:35   #18  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от ansoft Посмотреть сообщение
Как переключиться в текущем соединении...
X++:
Connection  conn    = new Connection();
...на другую БД? Подскажите...
Ессно, при условии, что все права на SQL к БД настроены, т.е. есть для юзера АОСа и пусть даже для юзера из сессии которого все выполняется.
Никак. Объект Connection - это создание подключения, используя реквизиты подключения Axapta к "родной" базе данных. Т.е. заранее преднастроенных реквизитов, изменение которых "изнутри" Axapta не предусмотрено.

Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида

X++:
Statement.executeQuery('select count(*) from LinkedServer.DataBase.dbo.MyTable')
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 29.07.2013, 11:48   #19  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Никак. Объект Connection - это создание подключения, используя реквизиты подключения Axapta к "родной" базе данных. Т.е. заранее преднастроенных реквизитов, изменение которых "изнутри" Axapta не предусмотрено.

Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида
Спасибо... так и думал...
Однако Linked-сервер не поможет решить задачу вызова хранимой процедуры с того же сервера SQL из другой БД.
Можно конечна извратиться и создать в БД Аксапты хранимую процедуру и оттуда вызвать хранимую процедуру соседней базы, но проще все же какаду с одибисями.

Умолкаю в этой теме... добавить нечего. Всем спасибо.
Старый 29.07.2013, 11:58   #20  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Коллеги, вы когда в ManagementStudio делаете Select Top 1000 Rows из какой-нибудь базы, у вас какой контекст БД используется?... правильный ответ "master"
То есть подключаясь к одной БД, получить данные из другой нет вообще никаких проблем, кроме прав. Аналогичная ситуация и с хранимками.

----
Например, если у вас на одном серваке рабочая база и дев база и АОСы ходят под одной учетку, то из дев приложения можно спокойно посмотреть данные в рабочей и даже добавить себя админом, ну и т.п.

Последний раз редактировалось Wamr; 29.07.2013 в 12:01.
За это сообщение автора поблагодарили: Владимир Максимов (2), ansoft (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 23:37.