25.07.2013, 08:51 | #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. |
|
25.07.2013, 09:31 | #2 |
Участник
|
У вас джоб на клиенте работает !
X++: C)\Jobs\sqlServerTest - line 18 Запускайте через меню итем или выносите код в статический метод класса. |
|
|
За это сообщение автора поблагодарили: dech (1). |
25.07.2013, 11:19 | #3 |
Участник
|
Спасибо большое. А как теперь выполнить хранимую процедуру, которая работает с другой базой данных на том же SQL Server? Пишет ошибку.
__________________
// no comments |
|
25.07.2013, 11:41 | #4 |
Модератор
|
Цитата:
__________________
-ТСЯ или -ТЬСЯ ? |
|
25.07.2013, 12:28 | #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()); }
__________________
Кононов Пётр |
|
25.07.2013, 12:33 | #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. |
|
25.07.2013, 12:55 | #7 |
Участник
|
Проверил... не работает... видно не хочет переключать БД... оно видно и правильно по безопасности
Остаеться как вариант через System.Data.SqlClient.SqlConnection... System.Data.SqlClient.SqlCommand и т.п. Последний раз редактировалось ansoft; 25.07.2013 в 12:59. |
|
25.07.2013, 13:13 | #8 |
Молодой, подающий надежды
|
А через 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 |
Участник
|
Цитата:
А во вторых, если все-таки так и сделать, то: Cannot execute the required database operation. This function is no longer supported. Даже, если вмето метода executeQuery() вызвать executeUpdate().
__________________
// no comments |
|
28.07.2013, 09:56 | #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. |
|
28.07.2013, 23:56 | #11 |
----------------
|
Во-первых, процедуры запускаются через excuteUpdate.
Во-вторых, к соседней базе должен быть доступ у учетки, под которой АОС работает. А все эти какаду и одибися под такую задачу не нужны. |
|
29.07.2013, 09:20 | #12 |
Участник
|
Цитата:
А все эти какаду и одибися под такую задачу не нужны.
X++: Connection conn = new Connection(); Ессно, при условии, что все права на SQL к БД настроены, т.е. есть для юзера АОСа и пусть даже для юзера из сессии которого все выполняется. |
|
29.07.2013, 09:29 | #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. |
|
29.07.2013, 09:38 | #14 |
Участник
|
Цитата:
Вместо функций setServer и setDatabase надо вызывать setOther для класса LoginProperty Последний раз редактировалось Ace of Database; 29.07.2013 в 09:40. |
|
29.07.2013, 09:50 | #15 |
Участник
|
Спасибо вам Ace of Database, однако я хотел бы получить ответ для цитаты...
Цитата:
А все эти какаду и одибися под такую задачу не нужны.
Цитата:
одибися
X++: odbcConnection = new OdbcConnection(LP); По большому счету X++: Connection conn = new Connection(); Последний раз редактировалось ansoft; 29.07.2013 в 11:07. |
|
29.07.2013, 10:22 | #16 |
Участник
|
Извините, я просто заметил знакомые буквы, поэтому среагировал и ответил. Глубины вопроса я не понял. Всегда пытаюсь делать тупо чтобы работало. Если по-тупому не работает, значит надо переосмыслить задачу, чтобы найти тупое решение, которое бы работало.
|
|
29.07.2013, 10:47 | #17 |
Участник
|
Цитата:
Интерес к вопросу тем не менее остался... Последний раз редактировалось ansoft; 29.07.2013 в 10:50. |
|
29.07.2013, 11:35 | #18 |
Участник
|
Цитата:
Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида X++: Statement.executeQuery('select count(*) from LinkedServer.DataBase.dbo.MyTable')
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
29.07.2013, 11:48 | #19 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Никак. Объект Connection - это создание подключения, используя реквизиты подключения Axapta к "родной" базе данных. Т.е. заранее преднастроенных реквизитов, изменение которых "изнутри" Axapta не предусмотрено.
Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида Однако Linked-сервер не поможет решить задачу вызова хранимой процедуры с того же сервера SQL из другой БД. Можно конечна извратиться и создать в БД Аксапты хранимую процедуру и оттуда вызвать хранимую процедуру соседней базы, но проще все же какаду с одибисями. Умолкаю в этой теме... добавить нечего. Всем спасибо. |
|
29.07.2013, 11:58 | #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 |
|