|
|
#1 |
|
Участник
|
Выполнение кода на стороне 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. |
|
|
|
|
#2 |
|
Участник
|
У вас джоб на клиенте работает !
X++: C)\Jobs\sqlServerTest - line 18 Запускайте через меню итем или выносите код в статический метод класса. |
|
|
|
| За это сообщение автора поблагодарили: dech (1). | |
|
|
#3 |
|
Участник
|
Спасибо большое. А как теперь выполнить хранимую процедуру, которая работает с другой базой данных на том же SQL Server? Пишет ошибку.
__________________
// no comments |
|
|
|
|
#4 |
|
Модератор
|
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
|
|
#5 |
|
Молодой, подающий надежды
|
Цитата:
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()); } |
|
|
|
|
#6 |
|
Участник
|
Цитата:
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. |
|
|
|
|
#7 |
|
Участник
|
Проверил... не работает... видно не хочет переключать БД... оно видно и правильно по безопасности
Остаеться как вариант через System.Data.SqlClient.SqlConnection... System.Data.SqlClient.SqlCommand и т.п. Последний раз редактировалось ansoft; 25.07.2013 в 12:59. |
|
|
|
|
#8 |
|
Молодой, подающий надежды
|
А через ODBCConnection тоже не работает?
X++: LoginProperty loginProp;
ODBCConnection connection;
loginProp = new LoginProperty();
loginProp.setServer('serverName');
loginProp.setDatabase('databaseName');
connection = new ODBCConnection(loginProp);
} |
|
|
|
|
#9 |
|
Участник
|
Цитата:
А во вторых, если все-таки так и сделать, то: Cannot execute the required database operation. This function is no longer supported. Даже, если вмето метода executeQuery() вызвать executeUpdate().
__________________
// no comments |
|
|
|
|
#10 |
|
Участник
|
Цитата:
... у меня на сервере есть админские права
Цитата:
Ну во-первых надо явно в коде прописывать логин/пароль.
Если нет острой необходимости запускать вызов на сервере, то можно через классы CCADOConnection и CCADOCommand (они в стандарте клиентские). Подключиться можно куда надо и вызвать что угодно... Работает 100% в нашей системе. Возможно в строке подключения использовать Trusted connection (оно же Integrated Security=SSPI) X++: Server=myServerAddress;Database=myDataBase;Trusted_Connection=True; На сервере работают и в пакетах выполняемых на сервере (у нас правда AX 2009 а не 4, однако указанные классы были еще и в 3) Последний раз редактировалось ansoft; 28.07.2013 в 10:02. |
|
|
|
|
#11 |
|
----------------
|
Во-первых, процедуры запускаются через excuteUpdate.
Во-вторых, к соседней базе должен быть доступ у учетки, под которой АОС работает. А все эти какаду и одибися под такую задачу не нужны. |
|
|
|
|
#12 |
|
Участник
|
Цитата:
А все эти какаду и одибися под такую задачу не нужны.
X++: Connection conn = new Connection();Ессно, при условии, что все права на SQL к БД настроены, т.е. есть для юзера АОСа и пусть даже для юзера из сессии которого все выполняется. |
|
|
|
|
#13 |
|
Участник
|
Цитата:
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. |
|
|
|
|
#14 |
|
Участник
|
Цитата:
Вместо функций setServer и setDatabase надо вызывать setOther для класса LoginProperty Последний раз редактировалось Ace of Database; 29.07.2013 в 09:40. |
|
|
|
|
#15 |
|
Участник
|
Спасибо вам Ace of Database, однако я хотел бы получить ответ для цитаты...
Цитата:
А все эти какаду и одибися под такую задачу не нужны.
Цитата:
одибися
X++: odbcConnection = new OdbcConnection(LP);По большому счету X++: Connection conn = new Connection();Последний раз редактировалось ansoft; 29.07.2013 в 11:07. |
|
|
|
|
#16 |
|
Участник
|
Извините, я просто заметил знакомые буквы, поэтому среагировал и ответил.
Глубины вопроса я не понял. Всегда пытаюсь делать тупо чтобы работало. Если по-тупому не работает, значит надо переосмыслить задачу, чтобы найти тупое решение, которое бы работало.
|
|
|
|
|
#17 |
|
Участник
|
Цитата:
![]() Интерес к вопросу тем не менее остался... Последний раз редактировалось ansoft; 29.07.2013 в 10:50. |
|
|
|
|
#18 |
|
Участник
|
Цитата:
Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида X++: Statement.executeQuery('select count(*) from LinkedServer.DataBase.dbo.MyTable')
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
|
|
#19 |
|
Участник
|
Цитата:
Сообщение от Владимир Максимов
Никак. Объект Connection - это создание подключения, используя реквизиты подключения Axapta к "родной" базе данных. Т.е. заранее преднастроенных реквизитов, изменение которых "изнутри" Axapta не предусмотрено.
Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида ![]() Однако Linked-сервер не поможет решить задачу вызова хранимой процедуры с того же сервера SQL из другой БД. Можно конечна извратиться и создать в БД Аксапты хранимую процедуру и оттуда вызвать хранимую процедуру соседней базы, но проще все же какаду с одибисями. Умолкаю в этой теме... добавить нечего. Всем спасибо. |
|
|
|
|
#20 |
|
----------------
|
Коллеги, вы когда в 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 | 0 | |||
| Connection к другому SQL Server | 5 | |||
|